MENU navbar-image

Introduction

This documentation aims to provide all the information you need to work with our API.

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_KEY}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

You can retrieve your token by visiting your dashboard and clicking Generate API token.

Admin Management

APIs for super admin operations

Add New User

requires authentication

Create a new user and company (super admin only).

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/user" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"companyName\": \"New Company Ltd\",
    \"email\": \"user@example.com\",
    \"firstName\": \"John\",
    \"lastName\": \"Doe\",
    \"password\": \"SecurePass123!\",
    \"countryIsoCode\": \"US\",
    \"phoneNumber\": \"+1234567890\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/user"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "companyName": "New Company Ltd",
    "email": "user@example.com",
    "firstName": "John",
    "lastName": "Doe",
    "password": "SecurePass123!",
    "countryIsoCode": "US",
    "phoneNumber": "+1234567890"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/user',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'companyName' => 'New Company Ltd',
            'email' => 'user@example.com',
            'firstName' => 'John',
            'lastName' => 'Doe',
            'password' => 'SecurePass123!',
            'countryIsoCode' => 'US',
            'phoneNumber' => '+1234567890',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/user'
payload = {
    "companyName": "New Company Ltd",
    "email": "user@example.com",
    "firstName": "John",
    "lastName": "Doe",
    "password": "SecurePass123!",
    "countryIsoCode": "US",
    "phoneNumber": "+1234567890"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "email": "user@example.com",
        "firstName": "John",
        "lastName": "Doe",
        "phoneNumbers": [
            {
                "countryIsoCode": "US",
                "phoneNumber": "+1234567890",
                "isChecked": true,
                "isValid": true
            }
        ],
        "createdAt": "2024-01-20T12:00:00Z",
        "updatedAt": "2024-01-20T12:00:00Z",
        "defaultCompanySlug": "new-company-ltd",
        "emailVerifiedAt": null,
        "defaultCountryIsoCode": "US",
        "defaultCountryEmoji": "🇺🇸",
        "imgUrl": "https://www.gravatar.com/avatar/...",
        "imgThumbUrl": "https://www.gravatar.com/avatar/..."
    }
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "email": [
            "The email has already been taken."
        ],
        "companyName": [
            "The company name has already been taken."
        ]
    }
}
 

Request      

POST api/v1/sa/user

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

companyName   string   

The name of the company. Example: New Company Ltd

email   string   

The user's email address. Example: user@example.com

firstName   string   

The user's first name. Example: John

lastName   string   

The user's last name. Example: Doe

password   string   

The user's password (min 10 characters). Example: SecurePass123!

countryIsoCode   string   

The ISO code of the user's country. Example: US

phoneNumber   string   

The user's phone number. Example: +1234567890

Authentication

APIs for managing authentication sessions

Login user

Authenticate a user and create a new session. This endpoint validates the user's credentials and returns the authenticated user's details along with a session cookie.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/login" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"john@example.com\",
    \"password\": \"secret123!@#\",
    \"remember_me\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/login"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "john@example.com",
    "password": "secret123!@#",
    "remember_me": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/login',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'john@example.com',
            'password' => 'secret123!@#',
            'remember_me' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/login'
payload = {
    "email": "john@example.com",
    "password": "secret123!@#",
    "remember_me": true
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
        "createdAt": "2025-11-12T20:27:08+00:00",
        "updatedAt": "2026-02-10T15:20:26+00:00",
        "defaultCompanySlug": null,
        "emailVerifiedAt": null,
        "defaultCountryIsoCode": "",
        "defaultCountryEmoji": "",
        "email": "liquid.ideas@gmail.com",
        "firstName": "Jo",
        "lastName": "Whitehouse",
        "phoneNumbers": [],
        "roles": [],
        "imgUrl": null,
        "imgThumbUrl": null,
        "imgLargeUrl": null,
        "imgUrlExpiresAt": null,
        "isActive": true,
        "disabledAt": null,
        "status": null,
        "statusName": null
    }
}
 

Example response (200, Success):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "email": "john@example.com",
        "firstName": "John",
        "lastName": "Doe",
        "phoneNumbers": [
            {
                "countryIsoCode": "GB",
                "phoneNumber": "+44...",
                "isChecked": true,
                "isValid": true
            }
        ],
        "createdAt": "2024-01-20T12:00:00Z",
        "updatedAt": "2024-01-20T12:00:00Z",
        "imgUrl": "https://example.com/profiles/john.jpg",
        "imgThumbUrl": "https://example.com/profiles/john_thumb.jpg",
        "defaultCompanySlug": "example-company",
        "emailVerifiedAt": "2024-01-20T11:00:00Z",
        "defaultCountryIsoCode": "GB",
        "defaultCountryEmoji": "🇬🇧"
    }
}
 

Example response (422, Invalid Credentials):


{
    "message": "The provided credentials are incorrect.",
    "errors": {
        "email": [
            "These credentials do not match our records."
        ]
    }
}
 

Example response (422, Invalid Credentials):


{
    "message": "The provided credentials are incorrect.",
    "errors": {
        "email": [
            "These credentials do not match our records."
        ]
    }
}
 

Example response (429, Too Many Attempts):


{
    "message": "Too many login attempts. Please try again in 60 seconds.",
    "errors": {
        "email": [
            "Too many login attempts."
        ]
    }
}
 

Example response (429, Too Many Attempts):


{
  "message": "Too many login attempts. Please try again in 60 seconds.",
  "errors": {
    "email": ["Too many login attempts."]
  }
 

Request      

POST api/v1/login

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

email   string   

The user's email address. Example: john@example.com

password   string   

The user's password (min 10 characters). Example: secret123!@#

remember_me   boolean  optional  

Remember the session for extended period (30 days). Example: true

Logout user

requires authentication

Invalidate the current user's session.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/logout" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/logout"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/logout',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/logout'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "msg": "Logged out"
}
 

Example response (204):

[Empty response]
 

Example response (401, Unauthenticated):


{
    "message": "Unauthenticated."
}
 

Example response (401):


{
 

Request      

GET api/v1/logout

POST api/v1/logout

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Authentication > Token Management

DELETE api/v1/logout/everywhere

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/logout/everywhere" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/logout/everywhere"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/logout/everywhere',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/logout/everywhere'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "message": "Logged out everywhere - all tokens and sessions invalidated"
    }
}
 

Request      

DELETE api/v1/logout/everywhere

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

POST api/v1/sanctum/token

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sanctum/token" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"user@example.com\",
    \"password\": \"SecurePass123!\",
    \"deviceName\": \"TrackLab Web\",
    \"abilities\": [
        \"deliveries:read\"
    ],
    \"expiresIn\": 1440,
    \"refreshExpiresIn\": 10080
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sanctum/token"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "user@example.com",
    "password": "SecurePass123!",
    "deviceName": "TrackLab Web",
    "abilities": [
        "deliveries:read"
    ],
    "expiresIn": 1440,
    "refreshExpiresIn": 10080
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sanctum/token',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'user@example.com',
            'password' => 'SecurePass123!',
            'deviceName' => 'TrackLab Web',
            'abilities' => [
                'deliveries:read',
            ],
            'expiresIn' => 1440,
            'refreshExpiresIn' => 10080,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sanctum/token'
payload = {
    "email": "user@example.com",
    "password": "SecurePass123!",
    "deviceName": "TrackLab Web",
    "abilities": [
        "deliveries:read"
    ],
    "expiresIn": 1440,
    "refreshExpiresIn": 10080
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "accessToken": "1|sanctum_abc",
        "refreshToken": "2|sanctum_xyz",
        "tokenType": "Bearer",
        "expiresIn": 900
    }
}
 

Request      

POST api/v1/sanctum/token

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

email   string   

User email address. Must be a valid email address. Example: user@example.com

password   string   

User password. Example: SecurePass123!

deviceName   string   

Name of the device requesting the token. Must not be greater than 255 characters. Example: TrackLab Web

abilities   object  optional  

Optional token abilities (defaults to ["*"]).

expiresIn   integer  optional  

Access token lifetime in minutes. Must be at least 1. Example: 1440

refreshExpiresIn   integer  optional  

Refresh token lifetime in minutes. Must be at least 1. Example: 10080

POST api/v1/sanctum/token/refresh

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sanctum/token/refresh" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"refreshToken\": \"2|laravel_sanctum_abc123\",
    \"expiresIn\": 1440,
    \"refreshExpiresIn\": 10080
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sanctum/token/refresh"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "refreshToken": "2|laravel_sanctum_abc123",
    "expiresIn": 1440,
    "refreshExpiresIn": 10080
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sanctum/token/refresh',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'refreshToken' => '2|laravel_sanctum_abc123',
            'expiresIn' => 1440,
            'refreshExpiresIn' => 10080,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sanctum/token/refresh'
payload = {
    "refreshToken": "2|laravel_sanctum_abc123",
    "expiresIn": 1440,
    "refreshExpiresIn": 10080
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "accessToken": "3|sanctum_new",
        "refreshToken": "4|sanctum_new_refresh",
        "tokenType": "Bearer",
        "expiresIn": 900
    }
}
 

Request      

POST api/v1/sanctum/token/refresh

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

refreshToken   string   

Refresh token issued during login. Example: 2|laravel_sanctum_abc123

expiresIn   integer  optional  

New access token lifetime in minutes. Must be at least 1. Example: 1440

refreshExpiresIn   integer  optional  

New refresh token lifetime in minutes. Must be at least 1. Example: 10080

DELETE api/v1/sanctum/token/current

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sanctum/token/current" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sanctum/token/current"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sanctum/token/current',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sanctum/token/current'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "message": "Current token revoked successfully"
    }
}
 

Request      

DELETE api/v1/sanctum/token/current

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

DELETE api/v1/sanctum/token/refresh

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sanctum/token/refresh" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"refreshToken\": \"2|laravel_sanctum_abc123\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sanctum/token/refresh"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "refreshToken": "2|laravel_sanctum_abc123"
};

fetch(url, {
    method: "DELETE",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sanctum/token/refresh',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'refreshToken' => '2|laravel_sanctum_abc123',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sanctum/token/refresh'
payload = {
    "refreshToken": "2|laravel_sanctum_abc123"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "message": "Refresh token revoked successfully"
    }
}
 

Request      

DELETE api/v1/sanctum/token/refresh

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

refreshToken   string   

Refresh token to revoke. Example: 2|laravel_sanctum_abc123

DELETE api/v1/sanctum/token/all

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sanctum/token/all" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sanctum/token/all"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sanctum/token/all',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sanctum/token/all'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "message": "All other tokens revoked successfully"
    }
}
 

Request      

DELETE api/v1/sanctum/token/all

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/sanctum/tokens

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sanctum/tokens" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sanctum/tokens"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sanctum/tokens',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sanctum/tokens'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "tokens": [
            {
                "tokenUuid": "550e8400-e29b-41d4-a716-446655440000",
                "name": "TrackLab Web",
                "abilities": [
                    "*"
                ],
                "lastUsedAt": "2024-01-20T12:00:00Z",
                "createdAt": "2024-01-19T12:00:00Z",
                "expiresAt": "2024-02-18T12:00:00Z",
                "isRefreshToken": false
            }
        ]
    }
}
 

Request      

GET api/v1/sanctum/tokens

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

DELETE api/v1/sanctum/token/{tokenUuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sanctum/token/5025355b-693f-384c-8140-9e85d38297c7" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"tokenUuid\": \"4e350ee3-9ebc-34ec-97c2-290726ff51c8\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sanctum/token/5025355b-693f-384c-8140-9e85d38297c7"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "tokenUuid": "4e350ee3-9ebc-34ec-97c2-290726ff51c8"
};

fetch(url, {
    method: "DELETE",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sanctum/token/5025355b-693f-384c-8140-9e85d38297c7',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'tokenUuid' => '4e350ee3-9ebc-34ec-97c2-290726ff51c8',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sanctum/token/5025355b-693f-384c-8140-9e85d38297c7'
payload = {
    "tokenUuid": "4e350ee3-9ebc-34ec-97c2-290726ff51c8"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "message": "Token revoked."
    }
}
 

Request      

DELETE api/v1/sanctum/token/{tokenUuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

tokenUuid   string   

Example: 5025355b-693f-384c-8140-9e85d38297c7

Body Parameters

tokenUuid   string   

Must be a valid UUID. Example: 4e350ee3-9ebc-34ec-97c2-290726ff51c8

Company - Data Retention

List all effective retention policies for the authenticated company.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/data-retention/policies" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/data-retention/policies"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/data-retention/policies',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/data-retention/policies'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/data-retention/policies

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Show a single effective retention policy for the authenticated company.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/data-retention/policies/collector-measurements" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/data-retention/policies/collector-measurements"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/data-retention/policies/collector-measurements',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/data-retention/policies/collector-measurements'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/data-retention/policies/{dataRetentionDataType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

dataRetentionDataType_slug   string   

The slug of the dataRetentionDataType. Example: collector-measurements

Company Activity Logs

List activity logs for the company.

requires authentication

Returns paginated activity logs for actions performed by users within the authenticated company.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/voluptatem/activity-logs?page=1&perPage=25&event=farm-section&action=update&logName=default&subjectType=Farm&causerUuid=550e8400-e29b-41d4-a716-446655440000&fromDate=2026-01-01&toDate=2026-12-31&batchUuid=550e8400-e29b-41d4-a716-446655440000&search=collector&sortBy=created_at&sortOrder=desc" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/voluptatem/activity-logs"
);

const params = {
    "page": "1",
    "perPage": "25",
    "event": "farm-section",
    "action": "update",
    "logName": "default",
    "subjectType": "Farm",
    "causerUuid": "550e8400-e29b-41d4-a716-446655440000",
    "fromDate": "2026-01-01",
    "toDate": "2026-12-31",
    "batchUuid": "550e8400-e29b-41d4-a716-446655440000",
    "search": "collector",
    "sortBy": "created_at",
    "sortOrder": "desc",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/voluptatem/activity-logs',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '25',
            'event' => 'farm-section',
            'action' => 'update',
            'logName' => 'default',
            'subjectType' => 'Farm',
            'causerUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'fromDate' => '2026-01-01',
            'toDate' => '2026-12-31',
            'batchUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'search' => 'collector',
            'sortBy' => 'created_at',
            'sortOrder' => 'desc',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/voluptatem/activity-logs'
params = {
  'page': '1',
  'perPage': '25',
  'event': 'farm-section',
  'action': 'update',
  'logName': 'default',
  'subjectType': 'Farm',
  'causerUuid': '550e8400-e29b-41d4-a716-446655440000',
  'fromDate': '2026-01-01',
  'toDate': '2026-12-31',
  'batchUuid': '550e8400-e29b-41d4-a716-446655440000',
  'search': 'collector',
  'sortBy': 'created_at',
  'sortOrder': 'desc',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/activity-logs

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: voluptatem

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 25

event   string  optional  

Filter by event category. Must not be greater than 255 characters. Example: farm-section

action   string  optional  

Filter by action type (e.g., "create", "update", "delete"). Must not be greater than 255 characters. Example: update

logName   string  optional  

Filter by log channel name. Must not be greater than 255 characters. Example: default

subjectType   string  optional  

Filter by affected model type (short name, e.g., "Farm", "Collector"). Must not be greater than 255 characters. Example: Farm

causerUuid   string  optional  

Filter by the UUID of a company user who performed the action. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

fromDate   string  optional  

Filter activities from this date (ISO 8601 format). Must be a valid date. Example: 2026-01-01

toDate   string  optional  

Filter activities up to this date (ISO 8601 format). Must be a valid date. Must be a date after or equal to fromDate. Example: 2026-12-31

batchUuid   string  optional  

Filter by batch UUID to get related activities. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

search   string  optional  

Search in properties, description, and event fields. Must not be greater than 255 characters. Example: collector

sortBy   string  optional  

Field to sort by (created_at, event, description, log_name). Example: created_at

sortOrder   string  optional  

Sort direction (asc, desc). Example: desc

Get available filter options for company activity logs.

requires authentication

Returns distinct values for events, log names, and subject types to populate filter dropdowns in the UI. Note: These are global values, not filtered by company scope.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/commodi/activity-logs/filter-options?page=1&perPage=25&event=farm-section&action=update&logName=default&subjectType=Farm&causerUuid=550e8400-e29b-41d4-a716-446655440000&fromDate=2026-01-01&toDate=2026-12-31&batchUuid=550e8400-e29b-41d4-a716-446655440000&search=collector&sortBy=created_at&sortOrder=desc" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/commodi/activity-logs/filter-options"
);

const params = {
    "page": "1",
    "perPage": "25",
    "event": "farm-section",
    "action": "update",
    "logName": "default",
    "subjectType": "Farm",
    "causerUuid": "550e8400-e29b-41d4-a716-446655440000",
    "fromDate": "2026-01-01",
    "toDate": "2026-12-31",
    "batchUuid": "550e8400-e29b-41d4-a716-446655440000",
    "search": "collector",
    "sortBy": "created_at",
    "sortOrder": "desc",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/commodi/activity-logs/filter-options',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '25',
            'event' => 'farm-section',
            'action' => 'update',
            'logName' => 'default',
            'subjectType' => 'Farm',
            'causerUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'fromDate' => '2026-01-01',
            'toDate' => '2026-12-31',
            'batchUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'search' => 'collector',
            'sortBy' => 'created_at',
            'sortOrder' => 'desc',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/commodi/activity-logs/filter-options'
params = {
  'page': '1',
  'perPage': '25',
  'event': 'farm-section',
  'action': 'update',
  'logName': 'default',
  'subjectType': 'Farm',
  'causerUuid': '550e8400-e29b-41d4-a716-446655440000',
  'fromDate': '2026-01-01',
  'toDate': '2026-12-31',
  'batchUuid': '550e8400-e29b-41d4-a716-446655440000',
  'search': 'collector',
  'sortBy': 'created_at',
  'sortOrder': 'desc',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/activity-logs/filter-options

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: commodi

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 25

event   string  optional  

Filter by event category. Must not be greater than 255 characters. Example: farm-section

action   string  optional  

Filter by action type (e.g., "create", "update", "delete"). Must not be greater than 255 characters. Example: update

logName   string  optional  

Filter by log channel name. Must not be greater than 255 characters. Example: default

subjectType   string  optional  

Filter by affected model type (short name, e.g., "Farm", "Collector"). Must not be greater than 255 characters. Example: Farm

causerUuid   string  optional  

Filter by the UUID of a company user who performed the action. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

fromDate   string  optional  

Filter activities from this date (ISO 8601 format). Must be a valid date. Example: 2026-01-01

toDate   string  optional  

Filter activities up to this date (ISO 8601 format). Must be a valid date. Must be a date after or equal to fromDate. Example: 2026-12-31

batchUuid   string  optional  

Filter by batch UUID to get related activities. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

search   string  optional  

Search in properties, description, and event fields. Must not be greater than 255 characters. Example: collector

sortBy   string  optional  

Field to sort by (created_at, event, description, log_name). Example: created_at

sortOrder   string  optional  

Sort direction (asc, desc). Example: desc

Export activity logs for the company.

requires authentication

Exports activity logs with optional filtering. Supports CSV and JSON formats. Uses streaming for memory-efficient export of large datasets.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/ipsum/activity-logs/export?startDate=2026-01-01&endDate=2026-12-31&event=sa.device-model-type&action=create&logName=default&subjectType=User&causerUuid=550e8400-e29b-41d4-a716-446655440000&batchUuid=550e8400-e29b-41d4-a716-446655440000&search=firmware&format=csv" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/ipsum/activity-logs/export"
);

const params = {
    "startDate": "2026-01-01",
    "endDate": "2026-12-31",
    "event": "sa.device-model-type",
    "action": "create",
    "logName": "default",
    "subjectType": "User",
    "causerUuid": "550e8400-e29b-41d4-a716-446655440000",
    "batchUuid": "550e8400-e29b-41d4-a716-446655440000",
    "search": "firmware",
    "format": "csv",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/ipsum/activity-logs/export',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'startDate' => '2026-01-01',
            'endDate' => '2026-12-31',
            'event' => 'sa.device-model-type',
            'action' => 'create',
            'logName' => 'default',
            'subjectType' => 'User',
            'causerUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'batchUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'search' => 'firmware',
            'format' => 'csv',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/ipsum/activity-logs/export'
params = {
  'startDate': '2026-01-01',
  'endDate': '2026-12-31',
  'event': 'sa.device-model-type',
  'action': 'create',
  'logName': 'default',
  'subjectType': 'User',
  'causerUuid': '550e8400-e29b-41d4-a716-446655440000',
  'batchUuid': '550e8400-e29b-41d4-a716-446655440000',
  'search': 'firmware',
  'format': 'csv',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/activity-logs/export

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: ipsum

Query Parameters

startDate   string  optional  

Filter activities from this date (ISO 8601 format). Must be a valid date. Example: 2026-01-01

endDate   string  optional  

Filter activities up to this date (ISO 8601 format). Must be a valid date. Must be a date after or equal to startDate. Example: 2026-12-31

event   string  optional  

Filter by event category (e.g., "sa.device-model-type"). Must not be greater than 255 characters. Example: sa.device-model-type

action   string  optional  

Filter by action type (e.g., "create", "update", "delete"). Must not be greater than 255 characters. Example: create

logName   string  optional  

Filter by log channel name. Must not be greater than 255 characters. Example: default

subjectType   string  optional  

Filter by affected model type (short name, e.g., "User", "Farm"). Must not be greater than 255 characters. Example: User

causerUuid   string  optional  

Filter by the UUID of the user who performed the action. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

batchUuid   string  optional  

Filter by batch UUID to get related activities. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

search   string  optional  

Search in properties, description, and event fields. Must not be greater than 255 characters. Example: firmware

format   string  optional  

Export format: csv or json (default: json). Example: csv

Company Management

APIs for managing company information

Get Company Details

requires authentication

Retrieve the authenticated user's company details.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/atque" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/atque"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/atque',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/atque'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "slug": "example-company",
        "createdAt": "2024-01-20T12:00:00Z",
        "updatedAt": "2024-01-20T12:00:00Z",
        "enabled": true,
        "defaultCountryIsoCode": "ZA",
        "name": "Example Company",
        "logoUrl": "https://api.example.com/api/v1/c/example-company/logo/256",
        "logoThumbUrl": "https://api.example.com/api/v1/c/example-company/logo/48",
        "logoLargeUrl": "https://api.example.com/api/v1/c/example-company/logo/512",
        "logoUrlExpiresAt": "2024-01-21T12:00:00Z",
        "favicons": {
            "favicon16": "https://api.example.com/api/v1/c/example-company/logo/16",
            "favicon32": "https://api.example.com/api/v1/c/example-company/logo/32",
            "favicon48": "https://api.example.com/api/v1/c/example-company/logo/48",
            "appleTouchIcon": "https://api.example.com/api/v1/c/example-company/logo/180",
            "android192": "https://api.example.com/api/v1/c/example-company/logo/192",
            "android512": "https://api.example.com/api/v1/c/example-company/logo/512"
        }
    }
}
 

Request      

GET api/v1/c/{company_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: atque

Update Company Details

requires authentication

Update the authenticated company's basic details.

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/c/tracklab" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"TrackLab\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "TrackLab"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/c/tracklab',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'TrackLab',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab'
payload = {
    "name": "TrackLab"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "slug": "example-company",
        "createdAt": "2024-01-20T12:00:00Z",
        "updatedAt": "2024-01-21T12:00:00Z",
        "enabled": true,
        "defaultCountryIsoCode": "ZA",
        "name": "Updated Example Company",
        "logoUrl": null,
        "logoThumbUrl": null,
        "logoLargeUrl": null,
        "logoUrlExpiresAt": null,
        "favicons": null
    }
}
 

Request      

PATCH api/v1/c/{company_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

name   string   

Company name. Must not be greater than 255 characters. Example: TrackLab

GET api/v1/c/{company_slug}/address

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/corrupti/address" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/corrupti/address"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/corrupti/address',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/corrupti/address'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/address

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: corrupti

POST api/v1/c/{company_slug}/address

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/aut/address" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"addressString\": \"123 Main St, London SW1A 1AA\",
    \"addressLine1\": \"123 Main Street\",
    \"city\": \"London\",
    \"postCode\": \"SW1A 1AA\",
    \"countryIsoCode\": \"GB\",
    \"addressLine2\": \"Apt 4B\",
    \"neighborhood\": \"Westminster\",
    \"locality\": \"Central London\",
    \"place\": \"Piccadilly Circus\",
    \"district\": \"City of Westminster\",
    \"region\": \"Greater London\",
    \"location\": {
        \"lat\": 51.5074,
        \"long\": -0.1278,
        \"latitude\": 51.5074,
        \"longitude\": -0.1278
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/aut/address"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "addressString": "123 Main St, London SW1A 1AA",
    "addressLine1": "123 Main Street",
    "city": "London",
    "postCode": "SW1A 1AA",
    "countryIsoCode": "GB",
    "addressLine2": "Apt 4B",
    "neighborhood": "Westminster",
    "locality": "Central London",
    "place": "Piccadilly Circus",
    "district": "City of Westminster",
    "region": "Greater London",
    "location": {
        "lat": 51.5074,
        "long": -0.1278,
        "latitude": 51.5074,
        "longitude": -0.1278
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/aut/address',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'addressString' => '123 Main St, London SW1A 1AA',
            'addressLine1' => '123 Main Street',
            'city' => 'London',
            'postCode' => 'SW1A 1AA',
            'countryIsoCode' => 'GB',
            'addressLine2' => 'Apt 4B',
            'neighborhood' => 'Westminster',
            'locality' => 'Central London',
            'place' => 'Piccadilly Circus',
            'district' => 'City of Westminster',
            'region' => 'Greater London',
            'location' => [
                'lat' => 51.5074,
                'long' => -0.1278,
                'latitude' => 51.5074,
                'longitude' => -0.1278,
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/aut/address'
payload = {
    "addressString": "123 Main St, London SW1A 1AA",
    "addressLine1": "123 Main Street",
    "city": "London",
    "postCode": "SW1A 1AA",
    "countryIsoCode": "GB",
    "addressLine2": "Apt 4B",
    "neighborhood": "Westminster",
    "locality": "Central London",
    "place": "Piccadilly Circus",
    "district": "City of Westminster",
    "region": "Greater London",
    "location": {
        "lat": 51.5074,
        "long": -0.1278,
        "latitude": 51.5074,
        "longitude": -0.1278
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/address

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: aut

Body Parameters

addressString   string  optional  

Full address as a single string. If provided, individual address fields are not required. Must not be greater than 500 characters. Example: 123 Main St, London SW1A 1AA

addressLine1   string   

First line of the address (required if addressString not provided). Must not be greater than 255 characters. Example: 123 Main Street

city   string   

City name (required if addressString not provided). Must not be greater than 255 characters. Example: London

postCode   string   

Postal code (required if addressString not provided). Must not be greater than 20 characters. Example: SW1A 1AA

countryIsoCode   string   

Two-letter ISO country code. The iso_code of an existing record in the countries table. Example: GB

addressLine2   string  optional  

Second line of the address. Must not be greater than 255 characters. Example: Apt 4B

neighborhood   string  optional  

Neighborhood name. Must not be greater than 255 characters. Example: Westminster

locality   string  optional  

Locality name. Must not be greater than 255 characters. Example: Central London

place   string  optional  

Place name. Must not be greater than 255 characters. Example: Piccadilly Circus

district   string  optional  

District name. Must not be greater than 255 characters. Example: City of Westminster

region   string  optional  

Region name. Must not be greater than 255 characters. Example: Greater London

location   object  optional  

Geographic coordinates (supports both latitude/longitude and lat/long formats).

latitude   number  optional  

Latitude coordinate (required if location object is provided). This field is required when location is present. Example: 51.5074

longitude   number  optional  

Longitude coordinate (required if location object is provided). This field is required when location is present. Example: -0.1278

requires authentication

Get the authenticated company's logo in the requested format.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/logo/magnam" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/logo/magnam"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/logo/magnam',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/logo/magnam'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/logo/{format?}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

format   string  optional  

Example: magnam

requires authentication

Company User Management

GET api/v1/c/{company_slug}/user

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/omnis/user" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/omnis/user"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/omnis/user',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/omnis/user'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
            "createdAt": "2025-11-12T20:27:08+00:00",
            "updatedAt": "2026-02-10T15:20:26+00:00",
            "defaultCompanySlug": null,
            "emailVerifiedAt": null,
            "defaultCountryIsoCode": "",
            "defaultCountryEmoji": "",
            "email": "liquid.ideas@gmail.com",
            "firstName": "Jo",
            "lastName": "Whitehouse",
            "phoneNumbers": [],
            "roles": [],
            "imgUrl": null,
            "imgThumbUrl": null,
            "imgLargeUrl": null,
            "imgUrlExpiresAt": null,
            "isActive": true,
            "disabledAt": null,
            "status": null,
            "statusName": null
        },
        {
            "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
            "createdAt": "2025-11-12T20:27:08+00:00",
            "updatedAt": "2026-02-10T15:20:26+00:00",
            "defaultCompanySlug": null,
            "emailVerifiedAt": null,
            "defaultCountryIsoCode": "",
            "defaultCountryEmoji": "",
            "email": "liquid.ideas@gmail.com",
            "firstName": "Jo",
            "lastName": "Whitehouse",
            "phoneNumbers": [],
            "roles": [],
            "imgUrl": null,
            "imgThumbUrl": null,
            "imgLargeUrl": null,
            "imgUrlExpiresAt": null,
            "isActive": true,
            "disabledAt": null,
            "status": null,
            "statusName": null
        }
    ]
}
 

Request      

GET api/v1/c/{company_slug}/user

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: omnis

POST api/v1/c/{company_slug}/user

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/et/user" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"admin@example.com\",
    \"firstName\": \"John\",
    \"lastName\": \"Doe\",
    \"countryIsoCode\": \"US\",
    \"phoneNumber\": \"+1234567890\",
    \"role\": \"user\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/et/user"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "admin@example.com",
    "firstName": "John",
    "lastName": "Doe",
    "countryIsoCode": "US",
    "phoneNumber": "+1234567890",
    "role": "user"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/et/user',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'admin@example.com',
            'firstName' => 'John',
            'lastName' => 'Doe',
            'countryIsoCode' => 'US',
            'phoneNumber' => '+1234567890',
            'role' => 'user',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/et/user'
payload = {
    "email": "admin@example.com",
    "firstName": "John",
    "lastName": "Doe",
    "countryIsoCode": "US",
    "phoneNumber": "+1234567890",
    "role": "user"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201):


{
    "data": {
        "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
        "createdAt": "2025-11-12T20:27:08+00:00",
        "updatedAt": "2026-02-10T15:20:26+00:00",
        "defaultCompanySlug": null,
        "emailVerifiedAt": null,
        "defaultCountryIsoCode": "",
        "defaultCountryEmoji": "",
        "email": "liquid.ideas@gmail.com",
        "firstName": "Jo",
        "lastName": "Whitehouse",
        "phoneNumbers": [],
        "roles": [],
        "imgUrl": null,
        "imgThumbUrl": null,
        "imgLargeUrl": null,
        "imgUrlExpiresAt": null,
        "isActive": true,
        "disabledAt": null,
        "status": null,
        "statusName": null
    }
}
 

Example response (422):


{
    "message": "The email has already been taken."
}
 

Request      

POST api/v1/c/{company_slug}/user

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: et

Body Parameters

email   string   

The user's email address. Must be a valid email address. Must not be greater than 100 characters. Example: admin@example.com

firstName   string   

The user's first name. Must be at least 2 characters. Must not be greater than 100 characters. Example: John

lastName   string  optional  

The user's last name. Must be at least 2 characters. Must not be greater than 100 characters. Example: Doe

countryIsoCode   string   

The ISO code of the user's country. The iso_code of an existing record in the countries table. Example: US

phoneNumber   string   

The user's phone number. Must be at least 6 characters. Example: +1234567890

role   string  optional  

Example: user

GET api/v1/c/{company_slug}/user/role-uuids

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/non/user/role-uuids" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/non/user/role-uuids"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/non/user/role-uuids',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/non/user/role-uuids'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        "550e8400-e29b-41d4-a716-446655440000",
        "7d793789-c8b3-4687-9287-c1e4c9c4b87b"
    ]
}
 

Request      

GET api/v1/c/{company_slug}/user/role-uuids

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: non

GET api/v1/c/{company_slug}/user/{user_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user\": \"a8e7bb49-aa3c-3c71-9cff-b08a3252d1ed\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "user": "a8e7bb49-aa3c-3c71-9cff-b08a3252d1ed"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'user' => 'a8e7bb49-aa3c-3c71-9cff-b08a3252d1ed',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd'
payload = {
    "user": "a8e7bb49-aa3c-3c71-9cff-b08a3252d1ed"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
        "createdAt": "2025-11-12T20:27:08+00:00",
        "updatedAt": "2026-02-10T15:20:26+00:00",
        "defaultCompanySlug": null,
        "emailVerifiedAt": null,
        "defaultCountryIsoCode": "",
        "defaultCountryEmoji": "",
        "email": "liquid.ideas@gmail.com",
        "firstName": "Jo",
        "lastName": "Whitehouse",
        "phoneNumbers": [],
        "roles": [],
        "imgUrl": null,
        "imgThumbUrl": null,
        "imgLargeUrl": null,
        "imgUrlExpiresAt": null,
        "isActive": true,
        "disabledAt": null,
        "status": null,
        "statusName": null
    }
}
 

Request      

GET api/v1/c/{company_slug}/user/{user_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

Body Parameters

user   string   

Must be a valid UUID. Example: a8e7bb49-aa3c-3c71-9cff-b08a3252d1ed

PATCH api/v1/c/{company_slug}/user/{user_uuid}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user\": \"d18f393a-5c44-345a-beff-d66e4a9d393c\",
    \"email\": \"john.doe@example.com\",
    \"firstName\": \"John\",
    \"lastName\": \"Doe\",
    \"countryIsoCode\": \"US\",
    \"phoneNumber\": \"+1234567890\",
    \"role\": \"admin\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "user": "d18f393a-5c44-345a-beff-d66e4a9d393c",
    "email": "john.doe@example.com",
    "firstName": "John",
    "lastName": "Doe",
    "countryIsoCode": "US",
    "phoneNumber": "+1234567890",
    "role": "admin"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'user' => 'd18f393a-5c44-345a-beff-d66e4a9d393c',
            'email' => 'john.doe@example.com',
            'firstName' => 'John',
            'lastName' => 'Doe',
            'countryIsoCode' => 'US',
            'phoneNumber' => '+1234567890',
            'role' => 'admin',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd'
payload = {
    "user": "d18f393a-5c44-345a-beff-d66e4a9d393c",
    "email": "john.doe@example.com",
    "firstName": "John",
    "lastName": "Doe",
    "countryIsoCode": "US",
    "phoneNumber": "+1234567890",
    "role": "admin"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
        "createdAt": "2025-11-12T20:27:08+00:00",
        "updatedAt": "2026-02-10T15:20:26+00:00",
        "defaultCompanySlug": null,
        "emailVerifiedAt": null,
        "defaultCountryIsoCode": "",
        "defaultCountryEmoji": "",
        "email": "liquid.ideas@gmail.com",
        "firstName": "Jo",
        "lastName": "Whitehouse",
        "phoneNumbers": [],
        "roles": [],
        "imgUrl": null,
        "imgThumbUrl": null,
        "imgLargeUrl": null,
        "imgUrlExpiresAt": null,
        "isActive": true,
        "disabledAt": null,
        "status": null,
        "statusName": null
    }
}
 

Request      

PATCH api/v1/c/{company_slug}/user/{user_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

Body Parameters

user   string   

Must be a valid UUID. Example: d18f393a-5c44-345a-beff-d66e4a9d393c

email   string  optional  

User email address. Must be a valid email address. Must not be greater than 100 characters. Example: john.doe@example.com

firstName   string  optional  

User first name. Must be at least 2 characters. Must not be greater than 100 characters. Example: John

lastName   string  optional  

User last name. Must be at least 2 characters. Must not be greater than 100 characters. Example: Doe

countryIsoCode   string  optional  

ISO code of the user country. The iso_code of an existing record in the countries table. Example: US

phoneNumber   string  optional  

User phone number. Must be at least 6 characters. Example: +1234567890

role   string  optional  

User role (owner, admin, or user). Example: admin

DELETE api/v1/c/{company_slug}/user/{user_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user\": \"c9d947b1-9e6b-36ee-9540-0ba8a349d21e\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "user": "c9d947b1-9e6b-36ee-9540-0ba8a349d21e"
};

fetch(url, {
    method: "DELETE",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'user' => 'c9d947b1-9e6b-36ee-9540-0ba8a349d21e',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd'
payload = {
    "user": "c9d947b1-9e6b-36ee-9540-0ba8a349d21e"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "success": true
}
 

Request      

DELETE api/v1/c/{company_slug}/user/{user_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

Body Parameters

user   string   

Must be a valid UUID. Example: c9d947b1-9e6b-36ee-9540-0ba8a349d21e

PATCH api/v1/c/{company_slug}/user/{user_uuid}/disable

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/disable" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user\": \"13460f35-347e-3bd9-8d21-71f506526333\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/disable"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "user": "13460f35-347e-3bd9-8d21-71f506526333"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/disable',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'user' => '13460f35-347e-3bd9-8d21-71f506526333',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/disable'
payload = {
    "user": "13460f35-347e-3bd9-8d21-71f506526333"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
        "createdAt": "2025-11-12T20:27:08+00:00",
        "updatedAt": "2026-02-10T15:20:26+00:00",
        "defaultCompanySlug": null,
        "emailVerifiedAt": null,
        "defaultCountryIsoCode": "",
        "defaultCountryEmoji": "",
        "email": "liquid.ideas@gmail.com",
        "firstName": "Jo",
        "lastName": "Whitehouse",
        "phoneNumbers": [],
        "roles": [],
        "imgUrl": null,
        "imgThumbUrl": null,
        "imgLargeUrl": null,
        "imgUrlExpiresAt": null,
        "isActive": true,
        "disabledAt": null,
        "status": null,
        "statusName": null
    }
}
 

Request      

PATCH api/v1/c/{company_slug}/user/{user_uuid}/disable

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

Body Parameters

user   string   

Must be a valid UUID. Example: 13460f35-347e-3bd9-8d21-71f506526333

PATCH api/v1/c/{company_slug}/user/{user_uuid}/enable

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/enable" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user\": \"b21a8f07-1adc-3526-8408-e27d7660a700\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/enable"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "user": "b21a8f07-1adc-3526-8408-e27d7660a700"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/enable',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'user' => 'b21a8f07-1adc-3526-8408-e27d7660a700',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/enable'
payload = {
    "user": "b21a8f07-1adc-3526-8408-e27d7660a700"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
        "createdAt": "2025-11-12T20:27:08+00:00",
        "updatedAt": "2026-02-10T15:20:26+00:00",
        "defaultCompanySlug": null,
        "emailVerifiedAt": null,
        "defaultCountryIsoCode": "",
        "defaultCountryEmoji": "",
        "email": "liquid.ideas@gmail.com",
        "firstName": "Jo",
        "lastName": "Whitehouse",
        "phoneNumbers": [],
        "roles": [],
        "imgUrl": null,
        "imgThumbUrl": null,
        "imgLargeUrl": null,
        "imgUrlExpiresAt": null,
        "isActive": true,
        "disabledAt": null,
        "status": null,
        "statusName": null
    }
}
 

Request      

PATCH api/v1/c/{company_slug}/user/{user_uuid}/enable

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

Body Parameters

user   string   

Must be a valid UUID. Example: b21a8f07-1adc-3526-8408-e27d7660a700

Update User Profile Picture

requires authentication

Upload or replace a user's profile picture.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "file=@/tmp/phpugsv2egs315qcuG4hRx" 
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('file', document.querySelector('input[name="file"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'file',
                'contents' => fopen('/tmp/phpugsv2egs315qcuG4hRx', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture'
files = {
  'file': open('/tmp/phpugsv2egs315qcuG4hRx', 'rb')
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'multipart/form-data',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, files=files)
response.json()

Example response (200):


{
    "data": {
        "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
        "createdAt": "2025-11-12T20:27:08+00:00",
        "updatedAt": "2026-02-10T15:20:26+00:00",
        "defaultCompanySlug": null,
        "emailVerifiedAt": null,
        "defaultCountryIsoCode": "",
        "defaultCountryEmoji": "",
        "email": "liquid.ideas@gmail.com",
        "firstName": "Jo",
        "lastName": "Whitehouse",
        "phoneNumbers": [],
        "roles": [],
        "imgUrl": null,
        "imgThumbUrl": null,
        "imgLargeUrl": null,
        "imgUrlExpiresAt": null,
        "isActive": true,
        "disabledAt": null,
        "status": null,
        "statusName": null
    }
}
 

Request      

POST api/v1/c/{company_slug}/user/{user_uuid}/profile/picture

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: multipart/form-data

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

Body Parameters

file   file   

The image file to upload. Must be an image (jpeg, png, etc). Example: /tmp/phpugsv2egs315qcuG4hRx

Get User Profile Picture

requires authentication

Retrieve a user's profile picture.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture/thumbnail" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture/thumbnail"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture/thumbnail',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/user/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture/thumbnail'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/user/{user_uuid}/profile/picture/{format?}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

format   string  optional  

The image format (original, thumbnail). Example: thumbnail

user   string   

The user UUID. Example: 550e8400-e29b-41d4-a716-446655440000

Bulk Upload Users

requires authentication

Upload a CSV file to create multiple users at once. CSV must have headers: email,firstName,lastName,roleSlug,phoneNumber

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/user/bulk" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "file=@/tmp/php2j65kcqemuc47U1cjnr" 
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/user/bulk"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('file', document.querySelector('input[name="file"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/user/bulk',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'file',
                'contents' => fopen('/tmp/php2j65kcqemuc47U1cjnr', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/user/bulk'
files = {
  'file': open('/tmp/php2j65kcqemuc47U1cjnr', 'rb')
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'multipart/form-data',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, files=files)
response.json()

Example response (200):


{
    "data": {
        "total": 10,
        "created": 8,
        "skipped": 1,
        "errors": 1,
        "results": [
            {
                "email": "john@example.com",
                "status": "created"
            },
            {
                "email": "existing@example.com",
                "status": "skipped",
                "reason": "User already exists"
            }
        ]
    }
}
 

Request      

POST api/v1/c/{company_slug}/user/bulk

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: multipart/form-data

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

file   file   

CSV file with user data. Max 2MB. Example: /tmp/php2j65kcqemuc47U1cjnr

Document Types

Get Document Types

requires authentication

Retrieve all available document types.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/document" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/document"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/document',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/document'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "slug": "unknown",
            "name": "unknown",
            "documentSectionTypeSlug": null,
            "documentFormatTypeSlug": null
        },
        {
            "slug": "unknown",
            "name": "unknown",
            "documentSectionTypeSlug": null,
            "documentFormatTypeSlug": null
        }
    ]
}
 

Request      

GET api/v1/type/document

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get Document Format Types

requires authentication

Retrieve all available document format types.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/document/format" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/document/format"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/document/format',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/document/format'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "slug": "unknown",
            "name": "unknown",
            "description": ""
        },
        {
            "slug": "unknown",
            "name": "unknown",
            "description": ""
        }
    ]
}
 

Request      

GET api/v1/type/document/format

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get Document Section Types

requires authentication

Retrieve all available document section types.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/document/section" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/document/section"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/document/section',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/document/section'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "slug": "unknown",
            "name": "unknown",
            "description": ""
        },
        {
            "slug": "unknown",
            "name": "unknown",
            "description": ""
        }
    ]
}
 

Request      

GET api/v1/type/document/section

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Documents

Get Public Document

Retrieve a publicly shared document using its UUID. This endpoint is publicly accessible without authentication.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/open-documents/4f1b6eb2-9e4a-3efc-a892-afec3de63f6e/pdf" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/open-documents/4f1b6eb2-9e4a-3efc-a892-afec3de63f6e/pdf"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/open-documents/4f1b6eb2-9e4a-3efc-a892-afec3de63f6e/pdf',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/open-documents/4f1b6eb2-9e4a-3efc-a892-afec3de63f6e/pdf'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


binary The document file
 

Example response (404):


{
    "message": "Document not found"
}
 

Request      

GET api/v1/open-documents/{openDocument_uuid}/{format?}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

openDocument_uuid   string   

Example: 4f1b6eb2-9e4a-3efc-a892-afec3de63f6e

format   string  optional  

optional The format to return the document in (pdf, jpg, png). If not provided, returns the original format. Example: pdf

openDocument   string   

The UUID of the document. Example: 550e8400-e29b-41d4-a716-446655440000

Endpoints

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sanctum/csrf-cookie" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sanctum/csrf-cookie"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sanctum/csrf-cookie',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sanctum/csrf-cookie'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (204):

Show headers
cache-control: no-cache, private
vary: Origin
set-cookie: XSRF-TOKEN=eyJpdiI6Ikx2Rks1YktPSmFTMyszb0VTUHVBMHc9PSIsInZhbHVlIjoiTlNmZFZodTM2b0JBOHdwblQ1WVp3KytGZy92OEZiWWJ6KzJRQlcrY1VmeFpNdGI5Z3E0Q3h5aTl6YnBTTHZuN3l6bFdUT2FRWWNINWpVeHp3ekR6TXJ1UlpwR3VwMDN2Q3UwZDNoekk5YkR4WVVQTlpvd1JhMHlLdWRsd3BzcUUiLCJtYWMiOiJlZmQ2ODg2NzZhM2YxNmRjMzUxNmVmNjEyNTExNTg2MWU2NmEzNjA4NzMyMzE1ZWNiYTIwZDYxNjI5ZDc1N2M1IiwidGFnIjoiIn0%3D; expires=Fri, 27 Mar 2026 01:05:07 GMT; Max-Age=7200; path=/; domain=tracklabsolar.com; secure; samesite=lax; tracklab_session=eyJpdiI6InNMZVVOWlFCTHJKckl6QllEdXFqQ0E9PSIsInZhbHVlIjoiV3llTDlvMXIvOWxJeUZjYXI1WERKSHlWa1NQYVAvN0loRjBicEFDRmR3aitmQzJ3TFFlUjVneGoxbU1uU3BNTTNEUDh1WVprOUlJaWJ2bFV1UXRkOUVDZDRBOXMyTnN2S1lJdXFSRzZsMkZFWTJoWThHUUh2ZHAvM3Z4bCs0c1EiLCJtYWMiOiJlZTYzYmRmMDFlYzE0ZWVhNGIwZWUyNTc3ODdiNjZiOGI0OTY1NjQxOTQ1MzAxZTRjNTg3NWU0YjI2MmZhMmI4IiwidGFnIjoiIn0%3D; expires=Fri, 27 Mar 2026 01:05:07 GMT; Max-Age=7200; path=/; domain=tracklabsolar.com; secure; httponly; samesite=lax
 
[Empty response]
 

Authenticate the request for channel access.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/broadcasting/auth" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/broadcasting/auth"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/broadcasting/auth',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/broadcasting/auth'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/broadcasting/auth

POST api/v1/broadcasting/auth

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/c/{company_slug}/automation-rules

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/deserunt/automation-rules" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/deserunt/automation-rules"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/deserunt/automation-rules',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/deserunt/automation-rules'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/automation-rules

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: deserunt

POST api/v1/c/{company_slug}/automation-rules

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/at/automation-rules" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"companySlug\": \"acme-solar\",
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440101\",
    \"collectorUuid\": \"550e8400-e29b-41d4-a716-446655440102\",
    \"status\": \"enabled\",
    \"name\": \"High Wind Stow Rule\",
    \"description\": \"Stows trackers when wind speed exceeds threshold.\",
    \"cooldownMinutes\": 15,
    \"autoClear\": true,
    \"clearAfterSeconds\": 300,
    \"evaluationPeriodSeconds\": 60,
    \"evaluationCountThreshold\": 3
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/at/automation-rules"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "companySlug": "acme-solar",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440101",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440102",
    "status": "enabled",
    "name": "High Wind Stow Rule",
    "description": "Stows trackers when wind speed exceeds threshold.",
    "cooldownMinutes": 15,
    "autoClear": true,
    "clearAfterSeconds": 300,
    "evaluationPeriodSeconds": 60,
    "evaluationCountThreshold": 3
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/at/automation-rules',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'companySlug' => 'acme-solar',
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440101',
            'collectorUuid' => '550e8400-e29b-41d4-a716-446655440102',
            'status' => 'enabled',
            'name' => 'High Wind Stow Rule',
            'description' => 'Stows trackers when wind speed exceeds threshold.',
            'cooldownMinutes' => 15,
            'autoClear' => true,
            'clearAfterSeconds' => 300,
            'evaluationPeriodSeconds' => 60,
            'evaluationCountThreshold' => 3,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/at/automation-rules'
payload = {
    "companySlug": "acme-solar",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440101",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440102",
    "status": "enabled",
    "name": "High Wind Stow Rule",
    "description": "Stows trackers when wind speed exceeds threshold.",
    "cooldownMinutes": 15,
    "autoClear": true,
    "clearAfterSeconds": 300,
    "evaluationPeriodSeconds": 60,
    "evaluationCountThreshold": 3
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/automation-rules

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: at

Body Parameters

companySlug   string  optional  

Company scope slug. Provide exactly one scope field. The slug of an existing record in the companies table. Example: acme-solar

farmUuid   string  optional  

Farm scope UUID. Provide exactly one scope field. Must be a valid UUID. The uuid of an existing record in the farms table. Example: 550e8400-e29b-41d4-a716-446655440101

collectorUuid   string  optional  

Collector scope UUID. Provide exactly one scope field. Must be a valid UUID. The uuid of an existing record in the collectors table. Example: 550e8400-e29b-41d4-a716-446655440102

status   string   

Automation rule status slug. The slug of an existing record in the automation_rule_status_types table. Example: enabled

name   string   

Automation rule name. Must not be greater than 255 characters. Example: High Wind Stow Rule

description   string  optional  

Automation rule description. Example: Stows trackers when wind speed exceeds threshold.

cooldownMinutes   integer  optional  

Cooldown between rule triggers in minutes. Must be at least 0. Example: 15

autoClear   boolean  optional  

Whether the rule should auto-clear. Example: true

clearAfterSeconds   integer  optional  

Seconds after which the rule auto-clears. Must be at least 0. Example: 300

evaluationPeriodSeconds   integer  optional  

Evaluation period in seconds. Must be at least 0. Example: 60

evaluationCountThreshold   integer  optional  

Number of breaches required in the evaluation period. Must be at least 0. Example: 3

GET api/v1/c/{company_slug}/automation-rules/{automationRule_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/automation-rules/47502e2b-4ffe-3a10-b16d-d676f89f6c53" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation-rules/47502e2b-4ffe-3a10-b16d-d676f89f6c53"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation-rules/47502e2b-4ffe-3a10-b16d-d676f89f6c53',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation-rules/47502e2b-4ffe-3a10-b16d-d676f89f6c53'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/automation-rules/{automationRule_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationRule_uuid   string   

Example: 47502e2b-4ffe-3a10-b16d-d676f89f6c53

PUT api/v1/c/{company_slug}/automation-rules/{automationRule_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/automation-rules/ac47c42a-b043-3453-acce-5da53f523046" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"status\": \"disabled\",
    \"name\": \"High Wind Stow Rule\",
    \"description\": \"Updated description for wind stow rule.\",
    \"cooldownMinutes\": 30,
    \"autoClear\": true,
    \"clearAfterSeconds\": 600,
    \"evaluationPeriodSeconds\": 120,
    \"evaluationCountThreshold\": 2
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation-rules/ac47c42a-b043-3453-acce-5da53f523046"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "status": "disabled",
    "name": "High Wind Stow Rule",
    "description": "Updated description for wind stow rule.",
    "cooldownMinutes": 30,
    "autoClear": true,
    "clearAfterSeconds": 600,
    "evaluationPeriodSeconds": 120,
    "evaluationCountThreshold": 2
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation-rules/ac47c42a-b043-3453-acce-5da53f523046',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'status' => 'disabled',
            'name' => 'High Wind Stow Rule',
            'description' => 'Updated description for wind stow rule.',
            'cooldownMinutes' => 30,
            'autoClear' => true,
            'clearAfterSeconds' => 600,
            'evaluationPeriodSeconds' => 120,
            'evaluationCountThreshold' => 2,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation-rules/ac47c42a-b043-3453-acce-5da53f523046'
payload = {
    "status": "disabled",
    "name": "High Wind Stow Rule",
    "description": "Updated description for wind stow rule.",
    "cooldownMinutes": 30,
    "autoClear": true,
    "clearAfterSeconds": 600,
    "evaluationPeriodSeconds": 120,
    "evaluationCountThreshold": 2
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/c/{company_slug}/automation-rules/{automationRule_uuid}

PATCH api/v1/c/{company_slug}/automation-rules/{automationRule_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationRule_uuid   string   

Example: ac47c42a-b043-3453-acce-5da53f523046

Body Parameters

status   string  optional  

Automation rule status slug. The slug of an existing record in the automation_rule_status_types table. Example: disabled

name   string  optional  

Automation rule name. Must not be greater than 255 characters. Example: High Wind Stow Rule

description   string  optional  

Automation rule description. Example: Updated description for wind stow rule.

cooldownMinutes   integer  optional  

Cooldown between rule triggers in minutes. Must be at least 0. Example: 30

autoClear   boolean  optional  

Whether the rule should auto-clear. Example: true

clearAfterSeconds   integer  optional  

Seconds after which the rule auto-clears. Must be at least 0. Example: 600

evaluationPeriodSeconds   integer  optional  

Evaluation period in seconds. Must be at least 0. Example: 120

evaluationCountThreshold   integer  optional  

Number of breaches required in the evaluation period. Must be at least 0. Example: 2

DELETE api/v1/c/{company_slug}/automation-rules/{automationRule_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/automation-rules/793e98b6-3cf2-3bb0-b6b3-b00682563920" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation-rules/793e98b6-3cf2-3bb0-b6b3-b00682563920"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation-rules/793e98b6-3cf2-3bb0-b6b3-b00682563920',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation-rules/793e98b6-3cf2-3bb0-b6b3-b00682563920'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/automation-rules/{automationRule_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationRule_uuid   string   

Example: 793e98b6-3cf2-3bb0-b6b3-b00682563920

GET api/v1/c/{company_slug}/automation-webhook-sources

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/amet/automation-webhook-sources" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/amet/automation-webhook-sources"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/amet/automation-webhook-sources',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/amet/automation-webhook-sources'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/automation-webhook-sources

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: amet

POST api/v1/c/{company_slug}/automation-webhook-sources

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/et/automation-webhook-sources" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Farm Weather Provider\",
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440020\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/et/automation-webhook-sources"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Farm Weather Provider",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440020"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/et/automation-webhook-sources',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Farm Weather Provider',
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440020',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/et/automation-webhook-sources'
payload = {
    "name": "Farm Weather Provider",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440020"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/automation-webhook-sources

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: et

Body Parameters

name   string   

Human-readable name for the inbound webhook source. Must not be greater than 255 characters. Example: Farm Weather Provider

farmUuid   string  optional  

Optional farm UUID to scope this source to one farm. Must be a valid UUID. The uuid of an existing record in the farms table. Example: 550e8400-e29b-41d4-a716-446655440020

GET api/v1/c/{company_slug}/automation-webhook-sources/{automationInboundWebhookSource_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/automation-webhook-sources/2c5ccbd0-ef65-3704-bff1-da1fa4e32bff" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation-webhook-sources/2c5ccbd0-ef65-3704-bff1-da1fa4e32bff"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation-webhook-sources/2c5ccbd0-ef65-3704-bff1-da1fa4e32bff',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation-webhook-sources/2c5ccbd0-ef65-3704-bff1-da1fa4e32bff'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/automation-webhook-sources/{automationInboundWebhookSource_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationInboundWebhookSource_uuid   string   

Example: 2c5ccbd0-ef65-3704-bff1-da1fa4e32bff

DELETE api/v1/c/{company_slug}/automation-webhook-sources/{automationInboundWebhookSource_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/automation-webhook-sources/1bd4f785-ca66-349a-892f-0444e61b3122" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation-webhook-sources/1bd4f785-ca66-349a-892f-0444e61b3122"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation-webhook-sources/1bd4f785-ca66-349a-892f-0444e61b3122',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation-webhook-sources/1bd4f785-ca66-349a-892f-0444e61b3122'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/automation-webhook-sources/{automationInboundWebhookSource_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationInboundWebhookSource_uuid   string   

Example: 1bd4f785-ca66-349a-892f-0444e61b3122

POST api/v1/c/{company_slug}/automation-webhook-sources/{automationInboundWebhookSource_uuid}/rotate

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/automation-webhook-sources/cebc0336-1d25-3643-a38c-5b4d9a1f73d3/rotate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation-webhook-sources/cebc0336-1d25-3643-a38c-5b4d9a1f73d3/rotate"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation-webhook-sources/cebc0336-1d25-3643-a38c-5b4d9a1f73d3/rotate',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation-webhook-sources/cebc0336-1d25-3643-a38c-5b4d9a1f73d3/rotate'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/c/{company_slug}/automation-webhook-sources/{automationInboundWebhookSource_uuid}/rotate

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationInboundWebhookSource_uuid   string   

Example: cebc0336-1d25-3643-a38c-5b4d9a1f73d3

GET api/v1/c/{company_slug}/automation-events

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/pariatur/automation-events" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/pariatur/automation-events"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/pariatur/automation-events',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/pariatur/automation-events'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/automation-events

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: pariatur

GET api/v1/c/{company_slug}/automation-events/{automationEvent_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/automation-events/02ccea26-141c-4f51-9aea-470b69cea45c" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation-events/02ccea26-141c-4f51-9aea-470b69cea45c"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation-events/02ccea26-141c-4f51-9aea-470b69cea45c',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation-events/02ccea26-141c-4f51-9aea-470b69cea45c'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/automation-events/{automationEvent_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationEvent_uuid   string   

Example: 02ccea26-141c-4f51-9aea-470b69cea45c

POST api/v1/c/{company_slug}/automation-events/manual

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/facilis/automation-events/manual" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"emergency_stow\",
    \"payload\": {
        \"reason\": \"high_wind\",
        \"speed\": 75
    },
    \"collectorUuid\": \"550e8400-e29b-41d4-a716-446655440001\",
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440002\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/facilis/automation-events/manual"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "emergency_stow",
    "payload": {
        "reason": "high_wind",
        "speed": 75
    },
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440001",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440002"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/facilis/automation-events/manual',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'emergency_stow',
            'payload' => [
                'reason' => 'high_wind',
                'speed' => 75,
            ],
            'collectorUuid' => '550e8400-e29b-41d4-a716-446655440001',
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440002',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/facilis/automation-events/manual'
payload = {
    "name": "emergency_stow",
    "payload": {
        "reason": "high_wind",
        "speed": 75
    },
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440001",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440002"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/automation-events/manual

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: facilis

Body Parameters

name   string   

The name of the manual event to fire. Must not be greater than 255 characters. Example: emergency_stow

payload   object  optional  

Optional payload data for the event.

collectorUuid   string  optional  

Optional collector UUID to scope the event. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440001

farmUuid   string  optional  

Optional farm UUID to scope the event. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440002

GET api/v1/c/{company_slug}/automation-executions

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/beatae/automation-executions" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/beatae/automation-executions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/beatae/automation-executions',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/beatae/automation-executions'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/automation-executions

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: beatae

GET api/v1/c/{company_slug}/automation-executions/{automationExecution_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/automation-executions/caca757f-1886-3529-892c-fa225b06d760" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation-executions/caca757f-1886-3529-892c-fa225b06d760"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation-executions/caca757f-1886-3529-892c-fa225b06d760',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation-executions/caca757f-1886-3529-892c-fa225b06d760'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/automation-executions/{automationExecution_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationExecution_uuid   string   

Example: caca757f-1886-3529-892c-fa225b06d760

POST api/v1/c/{company_slug}/automation/test/fire-event

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/molestiae/automation/test/fire-event" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"manual_stow_triggered\",
    \"payload\": {
        \"reason\": \"high_wind\",
        \"windSpeed\": 21.6
    },
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440040\",
    \"collectorUuid\": \"550e8400-e29b-41d4-a716-446655440041\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/molestiae/automation/test/fire-event"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "manual_stow_triggered",
    "payload": {
        "reason": "high_wind",
        "windSpeed": 21.6
    },
    "farmUuid": "550e8400-e29b-41d4-a716-446655440040",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440041"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/molestiae/automation/test/fire-event',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'manual_stow_triggered',
            'payload' => [
                'reason' => 'high_wind',
                'windSpeed' => 21.6,
            ],
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440040',
            'collectorUuid' => '550e8400-e29b-41d4-a716-446655440041',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/molestiae/automation/test/fire-event'
payload = {
    "name": "manual_stow_triggered",
    "payload": {
        "reason": "high_wind",
        "windSpeed": 21.6
    },
    "farmUuid": "550e8400-e29b-41d4-a716-446655440040",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440041"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/automation/test/fire-event

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: molestiae

Body Parameters

name   string   

Automation event name to fire. Must not be greater than 255 characters. Example: manual_stow_triggered

payload   object  optional  

Optional payload delivered with the event.

farmUuid   string  optional  

Optional farm UUID to scope the event. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440040

collectorUuid   string  optional  

Optional collector UUID to scope the event. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440041

POST api/v1/c/{company_slug}/automation/test/dry-run-match

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/mollitia/automation/test/dry-run-match" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"ruleUuid\": \"550e8400-e29b-41d4-a716-446655440030\",
    \"eventPayload\": {
        \"eventName\": \"wind_alert\",
        \"speed\": 72.4,
        \"unit\": \"kmh\"
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/mollitia/automation/test/dry-run-match"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "ruleUuid": "550e8400-e29b-41d4-a716-446655440030",
    "eventPayload": {
        "eventName": "wind_alert",
        "speed": 72.4,
        "unit": "kmh"
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/mollitia/automation/test/dry-run-match',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'ruleUuid' => '550e8400-e29b-41d4-a716-446655440030',
            'eventPayload' => [
                'eventName' => 'wind_alert',
                'speed' => 72.4,
                'unit' => 'kmh',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/mollitia/automation/test/dry-run-match'
payload = {
    "ruleUuid": "550e8400-e29b-41d4-a716-446655440030",
    "eventPayload": {
        "eventName": "wind_alert",
        "speed": 72.4,
        "unit": "kmh"
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/automation/test/dry-run-match

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: mollitia

Body Parameters

ruleUuid   string   

UUID of the automation rule to evaluate. Must be a valid UUID. The uuid of an existing record in the automation_rules table. Example: 550e8400-e29b-41d4-a716-446655440030

eventPayload   object   

Event payload to run against rule conditions without executing actions.

POST api/v1/c/{company_slug}/automation/test/preview-template

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/ea/automation/test/preview-template" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"template\": \"Alert: {{ collector.name }} exceeded {{ threshold }}.\",
    \"context\": {
        \"collector\": {
            \"name\": \"NCU-12\"
        },
        \"threshold\": 85
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/ea/automation/test/preview-template"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "template": "Alert: {{ collector.name }} exceeded {{ threshold }}.",
    "context": {
        "collector": {
            "name": "NCU-12"
        },
        "threshold": 85
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/ea/automation/test/preview-template',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'template' => 'Alert: {{ collector.name }} exceeded {{ threshold }}.',
            'context' => [
                'collector' => [
                    'name' => 'NCU-12',
                ],
                'threshold' => 85,
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/ea/automation/test/preview-template'
payload = {
    "template": "Alert: {{ collector.name }} exceeded {{ threshold }}.",
    "context": {
        "collector": {
            "name": "NCU-12"
        },
        "threshold": 85
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/automation/test/preview-template

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: ea

Body Parameters

template   string   

Template string to preview. Example: Alert: {{ collector.name }} exceeded {{ threshold }}.

context   object   

Template context data used for placeholder replacement.

POST api/v1/c/{company_slug}/automation/test/send-notification

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/sed/automation/test/send-notification" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"notificationPolicyUuid\": \"550e8400-e29b-41d4-a716-446655440050\",
    \"recipientEmail\": \"alerts@example.com\",
    \"context\": {
        \"collectorName\": \"NCU-5\",
        \"alarm\": \"overheat\"
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/sed/automation/test/send-notification"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "notificationPolicyUuid": "550e8400-e29b-41d4-a716-446655440050",
    "recipientEmail": "alerts@example.com",
    "context": {
        "collectorName": "NCU-5",
        "alarm": "overheat"
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/sed/automation/test/send-notification',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'notificationPolicyUuid' => '550e8400-e29b-41d4-a716-446655440050',
            'recipientEmail' => 'alerts@example.com',
            'context' => [
                'collectorName' => 'NCU-5',
                'alarm' => 'overheat',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/sed/automation/test/send-notification'
payload = {
    "notificationPolicyUuid": "550e8400-e29b-41d4-a716-446655440050",
    "recipientEmail": "alerts@example.com",
    "context": {
        "collectorName": "NCU-5",
        "alarm": "overheat"
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/automation/test/send-notification

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: sed

Body Parameters

notificationPolicyUuid   string   

UUID of the notification policy used for this test send. Must be a valid UUID. The uuid of an existing record in the notification_policies table. Example: 550e8400-e29b-41d4-a716-446655440050

recipientEmail   string   

Recipient email address for the test notification. Must be a valid email address. Example: alerts@example.com

context   object  optional  

Optional context payload rendered in the notification template.

GET api/v1/c/{company_slug}/automation/test/webhook-endpoints

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/laboriosam/automation/test/webhook-endpoints" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/laboriosam/automation/test/webhook-endpoints"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/laboriosam/automation/test/webhook-endpoints',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/laboriosam/automation/test/webhook-endpoints'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/automation/test/webhook-endpoints

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: laboriosam

POST api/v1/c/{company_slug}/automation/test/webhook-endpoints

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/ducimus/automation/test/webhook-endpoints" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"weather-station-test-endpoint\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/ducimus/automation/test/webhook-endpoints"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "weather-station-test-endpoint"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/ducimus/automation/test/webhook-endpoints',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'weather-station-test-endpoint',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/ducimus/automation/test/webhook-endpoints'
payload = {
    "name": "weather-station-test-endpoint"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/automation/test/webhook-endpoints

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: ducimus

Body Parameters

name   string   

Unique endpoint name within the company. Must not be greater than 255 characters. Example: weather-station-test-endpoint

GET api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/1af33b09-003c-3eab-ba81-018126292856" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/1af33b09-003c-3eab-ba81-018126292856"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/1af33b09-003c-3eab-ba81-018126292856',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/1af33b09-003c-3eab-ba81-018126292856'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: 1af33b09-003c-3eab-ba81-018126292856

PUT api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/be84b63c-dd87-3eda-b569-88ebc375cca6" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/be84b63c-dd87-3eda-b569-88ebc375cca6"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "enabled": true
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/be84b63c-dd87-3eda-b569-88ebc375cca6',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/be84b63c-dd87-3eda-b569-88ebc375cca6'
payload = {
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

PATCH api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: be84b63c-dd87-3eda-b569-88ebc375cca6

Body Parameters

enabled   boolean   

Whether this test webhook endpoint is enabled. Example: true

POST api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/rotate

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/914e15d4-6c65-3d69-a161-cc140c8d0332/rotate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/914e15d4-6c65-3d69-a161-cc140c8d0332/rotate"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/914e15d4-6c65-3d69-a161-cc140c8d0332/rotate',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/914e15d4-6c65-3d69-a161-cc140c8d0332/rotate'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/rotate

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: 914e15d4-6c65-3d69-a161-cc140c8d0332

DELETE api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/5e44c655-ff32-3871-b346-8e4a5e35adaf" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/5e44c655-ff32-3871-b346-8e4a5e35adaf"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/5e44c655-ff32-3871-b346-8e4a5e35adaf',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/5e44c655-ff32-3871-b346-8e4a5e35adaf'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: 5e44c655-ff32-3871-b346-8e4a5e35adaf

GET api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/events

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/8f09bdbc-ea8e-3276-a213-88db58ad1169/events?perPage=25&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/8f09bdbc-ea8e-3276-a213-88db58ad1169/events"
);

const params = {
    "perPage": "25",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/8f09bdbc-ea8e-3276-a213-88db58ad1169/events',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'perPage' => '25',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/8f09bdbc-ea8e-3276-a213-88db58ad1169/events'
params = {
  'perPage': '25',
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/events

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: 8f09bdbc-ea8e-3276-a213-88db58ad1169

Query Parameters

perPage   integer  optional  

Number of events to return per page. Must be at least 1. Must not be greater than 100. Example: 25

page   integer  optional  

Pagination page number. Must be at least 1. Example: 1

GET api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/events/latest

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/3fdd9be7-0482-36cf-a114-9c3119a30f1c/events/latest" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/3fdd9be7-0482-36cf-a114-9c3119a30f1c/events/latest"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/3fdd9be7-0482-36cf-a114-9c3119a30f1c/events/latest',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/3fdd9be7-0482-36cf-a114-9c3119a30f1c/events/latest'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/events/latest

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: 3fdd9be7-0482-36cf-a114-9c3119a30f1c

DELETE api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/events

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/cd571fe7-5e2c-3af9-a133-688dd983037c/events" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/cd571fe7-5e2c-3af9-a133-688dd983037c/events"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/cd571fe7-5e2c-3af9-a133-688dd983037c/events',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-endpoints/cd571fe7-5e2c-3af9-a133-688dd983037c/events'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/events

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: cd571fe7-5e2c-3af9-a133-688dd983037c

GET api/v1/c/{company_slug}/automation/test/webhook-events/{automationTestWebhookEvent_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-events/91e705ae-f385-375a-a367-24f678ab3937" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-events/91e705ae-f385-375a-a367-24f678ab3937"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-events/91e705ae-f385-375a-a367-24f678ab3937',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-events/91e705ae-f385-375a-a367-24f678ab3937'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/automation/test/webhook-events/{automationTestWebhookEvent_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEvent_uuid   string   

Example: 91e705ae-f385-375a-a367-24f678ab3937

DELETE api/v1/c/{company_slug}/automation/test/webhook-events/{automationTestWebhookEvent_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-events/40d59a83-9407-3d2f-b1ba-5c8d87455402" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-events/40d59a83-9407-3d2f-b1ba-5c8d87455402"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-events/40d59a83-9407-3d2f-b1ba-5c8d87455402',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/automation/test/webhook-events/40d59a83-9407-3d2f-b1ba-5c8d87455402'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/automation/test/webhook-events/{automationTestWebhookEvent_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEvent_uuid   string   

Example: 40d59a83-9407-3d2f-b1ba-5c8d87455402

POST api/v1/c/{company_slug}/automation/test/webhook-inbox/setup

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/vero/automation/test/webhook-inbox/setup" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Automation Test Inbox\",
    \"resetEvents\": false,
    \"rotateSecret\": true,
    \"notificationChannelUuid\": \"550e8400-e29b-41d4-a716-446655440010\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/vero/automation/test/webhook-inbox/setup"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Automation Test Inbox",
    "resetEvents": false,
    "rotateSecret": true,
    "notificationChannelUuid": "550e8400-e29b-41d4-a716-446655440010"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/vero/automation/test/webhook-inbox/setup',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Automation Test Inbox',
            'resetEvents' => false,
            'rotateSecret' => true,
            'notificationChannelUuid' => '550e8400-e29b-41d4-a716-446655440010',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/vero/automation/test/webhook-inbox/setup'
payload = {
    "name": "Automation Test Inbox",
    "resetEvents": false,
    "rotateSecret": true,
    "notificationChannelUuid": "550e8400-e29b-41d4-a716-446655440010"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/automation/test/webhook-inbox/setup

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: vero

Body Parameters

name   string  optional  

Optional display name for the webhook inbox endpoint. Must not be greater than 255 characters. Example: Automation Test Inbox

resetEvents   boolean  optional  

Whether to clear existing captured webhook events before setup. Example: false

rotateSecret   boolean  optional  

Whether to rotate the endpoint secret during setup. Example: true

notificationChannelUuid   string  optional  

Optional notification channel UUID to connect with this inbox. Must be a valid UUID. The uuid of an existing record in the notification_channels table. Example: 550e8400-e29b-41d4-a716-446655440010

List failure logs for a collector.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/failures" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/failures"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/failures',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/failures'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/collector/{collector_uuid}/failures

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: et

collector   string   

The UUID of the collector Example: esse

Report a new failure for a collector.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/failures" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"failureTypeSlug\": \"hardware_failure\",
    \"description\": \"Motor stuck\",
    \"severity\": \"high\",
    \"detectedAt\": \"2026-02-14T10:00:00Z\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/failures"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "failureTypeSlug": "hardware_failure",
    "description": "Motor stuck",
    "severity": "high",
    "detectedAt": "2026-02-14T10:00:00Z"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/failures',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'failureTypeSlug' => 'hardware_failure',
            'description' => 'Motor stuck',
            'severity' => 'high',
            'detectedAt' => '2026-02-14T10:00:00Z',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/failures'
payload = {
    "failureTypeSlug": "hardware_failure",
    "description": "Motor stuck",
    "severity": "high",
    "detectedAt": "2026-02-14T10:00:00Z"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/collector/{collector_uuid}/failures

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: quia

collector   string   

The UUID of the collector Example: amet

Body Parameters

failureTypeSlug   string   

The slug of the failure type. Example: hardware_failure

description   string   

Description of the failure. Example: Motor stuck

severity   string   

Severity level (low, medium, high, critical). Example: high

detectedAt   string  optional  

optional ISO 8601 datetime when failure was detected. Example: 2026-02-14T10:00:00Z

Create a new collector for the company

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Main Collector\",
    \"description\": \"Collector for north field\",
    \"locationJson\": {
        \"latitude\": 51.509865,
        \"longitude\": -0.118092
    },
    \"collectorTypeSlug\": \"ncu\",
    \"parentUuid\": \"550e8400-e29b-41d4-a716-446655440000\",
    \"serial\": \"COL-001-2024\",
    \"farmSectionUuid\": \"550e8400-e29b-41d4-a716-446655440123\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Main Collector",
    "description": "Collector for north field",
    "locationJson": {
        "latitude": 51.509865,
        "longitude": -0.118092
    },
    "collectorTypeSlug": "ncu",
    "parentUuid": "550e8400-e29b-41d4-a716-446655440000",
    "serial": "COL-001-2024",
    "farmSectionUuid": "550e8400-e29b-41d4-a716-446655440123"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Main Collector',
            'description' => 'Collector for north field',
            'locationJson' => [
                'latitude' => 51.509865,
                'longitude' => -0.118092,
            ],
            'collectorTypeSlug' => 'ncu',
            'parentUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'serial' => 'COL-001-2024',
            'farmSectionUuid' => '550e8400-e29b-41d4-a716-446655440123',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector'
payload = {
    "name": "Main Collector",
    "description": "Collector for north field",
    "locationJson": {
        "latitude": 51.509865,
        "longitude": -0.118092
    },
    "collectorTypeSlug": "ncu",
    "parentUuid": "550e8400-e29b-41d4-a716-446655440000",
    "serial": "COL-001-2024",
    "farmSectionUuid": "550e8400-e29b-41d4-a716-446655440123"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "name": "Main Collector",
        "description": "Collector for north field",
        "collectorTypeSlug": "ncu",
        "type": "NCU",
        "parentUuid": null,
        "childrenUuids": [],
        "serial": "COL-001-2024",
        "location": {
            "lat": 51.509865,
            "lng": -0.118092
        },
        "currentJunction": {
            "uuid": "550e8400-e29b-41d4-a716-446655440002",
            "farmSectionUuid": "550e8400-e29b-41d4-a716-446655440123",
            "row": 0,
            "column": 0
        },
        "createdAt": "2024-01-20T12:00:00Z",
        "updatedAt": "2024-01-20T12:00:00Z"
    }
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "name": [
            "The collector name field is required."
        ],
        "locationJson.latitude": [
            "The latitude must be between -90 and 90 degrees"
        ]
    }
}
 

Request      

POST api/v1/c/{company_slug}/collector

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

company   string   

The slug of the company Example: vel

Body Parameters

name   string   

The name of the collector. Example: Main Collector

description   string  optional  

optional The description of the collector. Example: Collector for north field

locationJson   object  optional  

Collector location (lat/lng).

latitude   numeric  optional  

optional The latitude coordinate between -90 and 90 (required when locationJson is provided). Example: 51.509865

longitude   numeric  optional  

optional The longitude coordinate between -180 and 180 (required when locationJson is provided). Example: -0.118092

collectorTypeSlug   string   

The collector type slug (ncu or tcu). Example: ncu

parentUuid   string  optional  

optional The UUID of the parent NCU (required when collectorTypeSlug is tcu). Example: 550e8400-e29b-41d4-a716-446655440000

serial   string   

The serial number of the collector. Example: COL-001-2024

farmSectionUuid   string   

The UUID of the farm section to assign the collector to. Example: 550e8400-e29b-41d4-a716-446655440123

Get All Collector Parameters

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/collector/parameter" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/parameter"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/parameter',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/parameter'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/collector/parameter

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

company   string   

The slug of the company Example: aut

Get All Collector Measurement Availability

requires authentication

Returns measurement availability (min/max timestamps) for all collectors in the company.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/collector/measurement/available" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/measurement/available"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/measurement/available',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/measurement/available'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "<collector-uuid>": {
            "<measurement-type-slug>": {
                "collectorUuid": "uuid-here",
                "collectorMeasurementTypeSlug": "ncu-cpu-temperature",
                "minTimestamp": "2025-11-12T22:40:36Z",
                "maxTimestamp": "2025-12-14T22:13:05Z",
                "dataTypeSlug": "numeric",
                "dataTypeName": "Numeric",
                "dataTypeIsNumeric": true
            }
        }
    }
}
 

Request      

GET api/v1/c/{company_slug}/collector/measurement/available

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

company   string   

The slug of the company Example: quia

Get Collector Measurement Availability Grouped

requires authentication

Returns measurement availability aggregated by measurement type across all collectors.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/collector/measurement/available/group" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/measurement/available/group"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/measurement/available/group',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/measurement/available/group'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "<measurement-type-slug>": {
            "collectorMeasurementTypeSlug": "ncu-cpu-temperature",
            "minTimestamp": "2025-11-12T22:40:36Z",
            "maxTimestamp": "2025-12-14T22:13:05Z"
        }
    }
}
 

Request      

GET api/v1/c/{company_slug}/collector/measurement/available/group

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

company   string   

The slug of the company Example: commodi

Get All Collectors

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/collector?page=1&perPage=15&type=ncu&parent_uuid=550e8400-e29b-41d4-a716-446655440000&format=paginated" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector"
);

const params = {
    "page": "1",
    "perPage": "15",
    "type": "ncu",
    "parent_uuid": "550e8400-e29b-41d4-a716-446655440000",
    "format": "paginated",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '15',
            'type' => 'ncu',
            'parent_uuid' => '550e8400-e29b-41d4-a716-446655440000',
            'format' => 'paginated',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector'
params = {
  'page': '1',
  'perPage': '15',
  'type': 'ncu',
  'parent_uuid': '550e8400-e29b-41d4-a716-446655440000',
  'format': 'paginated',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "data": [
        {
            "uuid": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
            "createdAt": "2026-02-12T13:40:48+00:00",
            "updatedAt": "2026-02-12T13:40:48+00:00",
            "enabled": true,
            "companySlug": "tracklab",
            "farmUuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
            "collectorTypeSlug": "ncu",
            "type": "NCU",
            "parentUuid": null,
            "childrenUuids": [],
            "serial": "SYSTEM-HOLDING-NCU",
            "name": "Unassigned Collectors",
            "description": "System-level holding NCU for auto-subscribed collectors awaiting assignment",
            "location": null,
            "isDecommissioned": false,
            "decommissionedAt": null,
            "decommissionReason": null,
            "currentTracker": null,
            "status": null,
            "hardwareVersion": null,
            "currentFirmware": null,
            "manufacturedAt": null,
            "deployedAt": null,
            "retiredAt": null
        },
        {
            "uuid": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
            "createdAt": "2026-02-12T13:40:48+00:00",
            "updatedAt": "2026-02-12T13:40:48+00:00",
            "enabled": true,
            "companySlug": "tracklab",
            "farmUuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
            "collectorTypeSlug": "ncu",
            "type": "NCU",
            "parentUuid": null,
            "childrenUuids": [],
            "serial": "SYSTEM-HOLDING-NCU",
            "name": "Unassigned Collectors",
            "description": "System-level holding NCU for auto-subscribed collectors awaiting assignment",
            "location": null,
            "isDecommissioned": false,
            "decommissionedAt": null,
            "decommissionReason": null,
            "currentTracker": null,
            "status": null,
            "hardwareVersion": null,
            "currentFirmware": null,
            "manufacturedAt": null,
            "deployedAt": null,
            "retiredAt": null
        }
    ]
}
 

Example response (200):


{
    "data": [
        {
            "uuid": "550e8400-e29b-41d4-a716-446655440000",
            "name": "Main Collector",
            "description": "Primary collector",
            "type": "NCU",
            "typeId": 1,
            "parentUuid": null,
            "childrenUuids": [
                "550e8400-e29b-41d4-a716-446655440001"
            ],
            "createdAt": "2024-01-20T12:00:00Z",
            "updatedAt": "2024-01-20T12:00:00Z",
            "enabled": true,
            "companySlug": "tracklab",
            "farmUuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
            "serial": "NCU-001",
            "location": {
                "lat": 51.509865,
                "lng": -0.118092
            }
        }
    ],
    "links": {
        "first": "http://example.com/api/company/tracklab/collector?page=1",
        "last": "http://example.com/api/company/tracklab/collector?page=5",
        "prev": null,
        "next": "http://example.com/api/company/tracklab/collector?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 5,
        "path": "http://example.com/api/company/tracklab/collector",
        "perPage": 15,
        "to": 15,
        "total": 75
    }
}
 

Request      

GET api/v1/c/{company_slug}/collector

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Query Parameters

page   integer  optional  

Page number for pagination. Example: 1

perPage   integer  optional  

Number of items per page. Example: 15

type   string  optional  

Filter by collector type (ncu or tcu). Example: ncu

parent_uuid   string  optional  

Filter TCUs by parent NCU UUID. Example: 550e8400-e29b-41d4-a716-446655440000

format   string  optional  

Response format (paginated or keyed). Default: paginated. Example: paginated

Response

Response Fields

data   object   
uuid   string   

The unique identifier of the collector

createdAt   string   

The creation timestamp (ISO8601)

updatedAt   string   

The last update timestamp (ISO8601)

enabled   boolean   

Whether the collector is enabled

companySlug   string   

The slug of the company this collector belongs to

farmUuid   string   

The UUID of the farm this collector belongs to

collectorTypeSlug   string   

The slug of the collector type

type   string   

The type of collector (NCU or TCU)

parentUuid   string|null   

The UUID of the parent collector (for TCUs)

childrenUuids   string[]   

Array of child collector UUIDs (for NCUs)

serial   string   

The serial number of the collector

name   string   

The name of the collector

description   string|null   

The description of the collector

location   object   

The location coordinates

lat   number   

The latitude coordinate

lng   number   

The longitude coordinate

isDecommissioned   boolean   

Whether the collector is decommissioned

decommissionedAt   string|null   

The decommission timestamp (ISO8601)

decommissionReason   string|null   

The reason for decommission

currentTracker   object|null   

The current tracker placement

uuid   string   

The tracker UUID

farmSectionUuid   string|null   

The farm section UUID

row   integer   

Row position in layout

column   integer   

Column position in layout

status   object|null   

The current lifecycle status

slug   string   

The status type slug

name   string   

The status type display name

hardwareVersion   object|null   

The hardware version type

slug   string   

The hardware version slug

name   string   

The hardware version display name

version   string|null   

The hardware version string

currentFirmware   object|null   

The current firmware information

slug   string   

The firmware type slug

name   string   

The firmware type display name

version   string|null   

The firmware version string

manufacturedAt   string|null   

The manufacture timestamp (ISO8601)

deployedAt   string|null   

The deployment timestamp (ISO8601)

retiredAt   string|null   

The retirement timestamp (ISO8601)

Update Collector

requires authentication

Update an existing collector's details.

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Updated Field Collector\",
    \"description\": \"Updated collector description\",
    \"locationJson\": {
        \"latitude\": 51.509865,
        \"longitude\": -0.118092
    },
    \"parentUuid\": \"550e8400-e29b-41d4-a716-446655440000\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Updated Field Collector",
    "description": "Updated collector description",
    "locationJson": {
        "latitude": 51.509865,
        "longitude": -0.118092
    },
    "parentUuid": "550e8400-e29b-41d4-a716-446655440000"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Updated Field Collector',
            'description' => 'Updated collector description',
            'locationJson' => [
                'latitude' => 51.509865,
                'longitude' => -0.118092,
            ],
            'parentUuid' => '550e8400-e29b-41d4-a716-446655440000',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa'
payload = {
    "name": "Updated Field Collector",
    "description": "Updated collector description",
    "locationJson": {
        "latitude": 51.509865,
        "longitude": -0.118092
    },
    "parentUuid": "550e8400-e29b-41d4-a716-446655440000"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
        "createdAt": "2026-02-12T13:40:48+00:00",
        "updatedAt": "2026-02-12T13:40:48+00:00",
        "enabled": true,
        "companySlug": "tracklab",
        "farmUuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
        "collectorTypeSlug": "ncu",
        "type": "NCU",
        "parentUuid": null,
        "childrenUuids": [],
        "serial": "SYSTEM-HOLDING-NCU",
        "name": "Unassigned Collectors",
        "description": "System-level holding NCU for auto-subscribed collectors awaiting assignment",
        "location": null,
        "isDecommissioned": false,
        "decommissionedAt": null,
        "decommissionReason": null,
        "currentTracker": null,
        "status": null,
        "hardwareVersion": null,
        "currentFirmware": null,
        "manufacturedAt": null,
        "deployedAt": null,
        "retiredAt": null
    }
}
 

Request      

PUT api/v1/c/{company_slug}/collector/{collector_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: at

collector   string   

The UUID of the collector Example: ipsa

Body Parameters

name   string   

The name of the collector. Example: Updated Field Collector

description   string  optional  

The description of the collector. Example: Updated collector description

locationJson   object  optional  

Collector location (lat/lng).

latitude   numeric  optional  

The latitude coordinate between -90 and 90. Example: 51.509865

longitude   numeric  optional  

The longitude coordinate between -180 and 180. Example: -0.118092

parentUuid   string  optional  

The UUID of the parent NCU (only for TCUs). Example: 550e8400-e29b-41d4-a716-446655440000

Response

Response Fields

data   object   
uuid   string   

The unique identifier of the collector

createdAt   string   

The creation timestamp (ISO8601)

updatedAt   string   

The last update timestamp (ISO8601)

enabled   boolean   

Whether the collector is enabled

companySlug   string   

The slug of the company this collector belongs to

farmUuid   string   

The UUID of the farm this collector belongs to

collectorTypeSlug   string   

The slug of the collector type

type   string   

The type of collector (NCU or TCU)

parentUuid   string|null   

The UUID of the parent collector (for TCUs)

childrenUuids   string[]   

Array of child collector UUIDs (for NCUs)

serial   string   

The serial number of the collector

name   string   

The name of the collector

description   string|null   

The description of the collector

location   object   

The location coordinates

lat   number   

The latitude coordinate

lng   number   

The longitude coordinate

isDecommissioned   boolean   

Whether the collector is decommissioned

decommissionedAt   string|null   

The decommission timestamp (ISO8601)

decommissionReason   string|null   

The reason for decommission

currentTracker   object|null   

The current tracker placement

uuid   string   

The tracker UUID

farmSectionUuid   string|null   

The farm section UUID

row   integer   

Row position in layout

column   integer   

Column position in layout

status   object|null   

The current lifecycle status

slug   string   

The status type slug

name   string   

The status type display name

hardwareVersion   object|null   

The hardware version type

slug   string   

The hardware version slug

name   string   

The hardware version display name

version   string|null   

The hardware version string

currentFirmware   object|null   

The current firmware information

slug   string   

The firmware type slug

name   string   

The firmware type display name

version   string|null   

The firmware version string

manufacturedAt   string|null   

The manufacture timestamp (ISO8601)

deployedAt   string|null   

The deployment timestamp (ISO8601)

retiredAt   string|null   

The retirement timestamp (ISO8601)

Get Collector Details

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "uuid": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
        "createdAt": "2026-02-12T13:40:48+00:00",
        "updatedAt": "2026-02-12T13:40:48+00:00",
        "enabled": true,
        "companySlug": "tracklab",
        "farmUuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
        "collectorTypeSlug": "ncu",
        "type": "NCU",
        "parentUuid": null,
        "childrenUuids": [],
        "serial": "SYSTEM-HOLDING-NCU",
        "name": "Unassigned Collectors",
        "description": "System-level holding NCU for auto-subscribed collectors awaiting assignment",
        "location": null,
        "isDecommissioned": false,
        "decommissionedAt": null,
        "decommissionReason": null,
        "currentTracker": null,
        "status": null,
        "hardwareVersion": null,
        "currentFirmware": null,
        "manufacturedAt": null,
        "deployedAt": null,
        "retiredAt": null
    }
}
 

Request      

GET api/v1/c/{company_slug}/collector/{collector_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: ex

collector   string   

The UUID of the collector Example: soluta

Response

Response Fields

data   object   
uuid   string   

The unique identifier of the collector

createdAt   string   

The creation timestamp (ISO8601)

updatedAt   string   

The last update timestamp (ISO8601)

enabled   boolean   

Whether the collector is enabled

companySlug   string   

The slug of the company this collector belongs to

farmUuid   string   

The UUID of the farm this collector belongs to

collectorTypeSlug   string   

The slug of the collector type

type   string   

The type of collector (NCU or TCU)

parentUuid   string|null   

The UUID of the parent collector (for TCUs)

childrenUuids   string[]   

Array of child collector UUIDs (for NCUs)

serial   string   

The serial number of the collector

name   string   

The name of the collector

description   string|null   

The description of the collector

location   object   

The location coordinates

lat   number   

The latitude coordinate

lng   number   

The longitude coordinate

isDecommissioned   boolean   

Whether the collector is decommissioned

decommissionedAt   string|null   

The decommission timestamp (ISO8601)

decommissionReason   string|null   

The reason for decommission

currentTracker   object|null   

The current tracker placement

uuid   string   

The tracker UUID

farmSectionUuid   string|null   

The farm section UUID

row   integer   

Row position in layout

column   integer   

Column position in layout

status   object|null   

The current lifecycle status

slug   string   

The status type slug

name   string   

The status type display name

hardwareVersion   object|null   

The hardware version type

slug   string   

The hardware version slug

name   string   

The hardware version display name

version   string|null   

The hardware version string

currentFirmware   object|null   

The current firmware information

slug   string   

The firmware type slug

name   string   

The firmware type display name

version   string|null   

The firmware version string

manufacturedAt   string|null   

The manufacture timestamp (ISO8601)

deployedAt   string|null   

The deployment timestamp (ISO8601)

retiredAt   string|null   

The retirement timestamp (ISO8601)

Get Child Collectors

requires authentication

Get all TCUs that belong to a specific NCU

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/children?page=1&perPage=15&format=paginated" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/children"
);

const params = {
    "page": "1",
    "perPage": "15",
    "format": "paginated",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/children',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '15',
            'format' => 'paginated',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/children'
params = {
  'page': '1',
  'perPage': '15',
  'format': 'paginated',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "data": [
        {
            "uuid": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
            "createdAt": "2026-02-12T13:40:48+00:00",
            "updatedAt": "2026-02-12T13:40:48+00:00",
            "enabled": true,
            "companySlug": "tracklab",
            "farmUuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
            "collectorTypeSlug": "ncu",
            "type": "NCU",
            "parentUuid": null,
            "childrenUuids": [],
            "serial": "SYSTEM-HOLDING-NCU",
            "name": "Unassigned Collectors",
            "description": "System-level holding NCU for auto-subscribed collectors awaiting assignment",
            "location": null,
            "isDecommissioned": false,
            "decommissionedAt": null,
            "decommissionReason": null,
            "currentTracker": null,
            "status": null,
            "hardwareVersion": null,
            "currentFirmware": null,
            "manufacturedAt": null,
            "deployedAt": null,
            "retiredAt": null
        },
        {
            "uuid": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
            "createdAt": "2026-02-12T13:40:48+00:00",
            "updatedAt": "2026-02-12T13:40:48+00:00",
            "enabled": true,
            "companySlug": "tracklab",
            "farmUuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
            "collectorTypeSlug": "ncu",
            "type": "NCU",
            "parentUuid": null,
            "childrenUuids": [],
            "serial": "SYSTEM-HOLDING-NCU",
            "name": "Unassigned Collectors",
            "description": "System-level holding NCU for auto-subscribed collectors awaiting assignment",
            "location": null,
            "isDecommissioned": false,
            "decommissionedAt": null,
            "decommissionReason": null,
            "currentTracker": null,
            "status": null,
            "hardwareVersion": null,
            "currentFirmware": null,
            "manufacturedAt": null,
            "deployedAt": null,
            "retiredAt": null
        }
    ]
}
 

Example response (200):


{
  "data": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440001",
      "name": "TCU 1",
      "description": "Tracking Control Unit 1",
      "type": "TCU",
      "typeId": 2,
      "parentUuid": "550e8400-e29b-41d4-a716-446655440000",
      "childrenUuids": [],
      "createdAt": "2024-01-20T12:00:00Z",
      "updatedAt": "2024-01-20T12:00:00Z",
      "enabled": true,
      "companySlug": "tracklab",
      "farmUuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
      "serial": "TCU-001",
      "location": {
        "lat": 51.509865,
        "lng": -0.118092
      }
    }
  ],
  "links": {...},
  "meta": {...}
}
 

Example response (400):


{
    "error": "Only NCU collectors can have children"
}
 

Request      

GET api/v1/c/{company_slug}/collector/{collector_uuid}/children

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: et

collector   string   

The UUID of the parent NCU collector Example: aliquam

Query Parameters

page   integer  optional  

Page number for pagination. Example: 1

perPage   integer  optional  

Number of items per page. Example: 15

format   string  optional  

Response format (paginated or keyed). Default: paginated. Example: paginated

Response

Response Fields

data   object   
uuid   string   

The unique identifier of the collector

createdAt   string   

The creation timestamp (ISO8601)

updatedAt   string   

The last update timestamp (ISO8601)

enabled   boolean   

Whether the collector is enabled

companySlug   string   

The slug of the company this collector belongs to

farmUuid   string   

The UUID of the farm this collector belongs to

collectorTypeSlug   string   

The slug of the collector type

type   string   

The type of collector (NCU or TCU)

parentUuid   string|null   

The UUID of the parent collector (for TCUs)

childrenUuids   string[]   

Array of child collector UUIDs (for NCUs)

serial   string   

The serial number of the collector

name   string   

The name of the collector

description   string|null   

The description of the collector

location   object   

The location coordinates

lat   number   

The latitude coordinate

lng   number   

The longitude coordinate

isDecommissioned   boolean   

Whether the collector is decommissioned

decommissionedAt   string|null   

The decommission timestamp (ISO8601)

decommissionReason   string|null   

The reason for decommission

currentTracker   object|null   

The current tracker placement

uuid   string   

The tracker UUID

farmSectionUuid   string|null   

The farm section UUID

row   integer   

Row position in layout

column   integer   

Column position in layout

status   object|null   

The current lifecycle status

slug   string   

The status type slug

name   string   

The status type display name

hardwareVersion   object|null   

The hardware version type

slug   string   

The hardware version slug

name   string   

The hardware version display name

version   string|null   

The hardware version string

currentFirmware   object|null   

The current firmware information

slug   string   

The firmware type slug

name   string   

The firmware type display name

version   string|null   

The firmware version string

manufacturedAt   string|null   

The manufacture timestamp (ISO8601)

deployedAt   string|null   

The deployment timestamp (ISO8601)

retiredAt   string|null   

The retirement timestamp (ISO8601)

Update Collector Parent

requires authentication

Update the parent NCU of a TCU collector

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/parent" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"parentUuid\": \"550e8400-e29b-41d4-a716-446655440000\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/parent"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "parentUuid": "550e8400-e29b-41d4-a716-446655440000"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/parent',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'parentUuid' => '550e8400-e29b-41d4-a716-446655440000',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/parent'
payload = {
    "parentUuid": "550e8400-e29b-41d4-a716-446655440000"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440001",
        "name": "TCU 1",
        "description": "Tracking Control Unit 1",
        "type": "TCU",
        "typeId": 2,
        "parentUuid": "550e8400-e29b-41d4-a716-446655440000"
    }
}
 

Example response (400):


{
    "error": "Only TCU collectors can have a parent"
}
 

Request      

PATCH api/v1/c/{company_slug}/collector/{collector_uuid}/parent

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: deserunt

collector   string   

The UUID of the TCU collector Example: sed

Body Parameters

parentUuid   string   

The UUID of the parent NCU collector. Example: 550e8400-e29b-41d4-a716-446655440000

Get Collector Parameters

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/parameter" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/parameter"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/parameter',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/parameter'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/collector/{collector_uuid}/parameter

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: qui

collector   string   

The UUID of the collector Example: dolore

Get Collector Measurement Availability

requires authentication

Returns measurement availability (min/max timestamps) for a single collector.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/measurement/available" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/measurement/available"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/measurement/available',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/measurement/available'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "<measurement-type-slug>": {
            "collectorUuid": "uuid-here",
            "collectorMeasurementTypeSlug": "ncu-cpu-temperature",
            "minTimestamp": "2025-11-12T22:40:36Z",
            "maxTimestamp": "2025-12-14T22:13:05Z",
            "dataTypeSlug": "numeric",
            "dataTypeName": "Numeric",
            "dataTypeIsNumeric": true
        }
    }
}
 

Request      

GET api/v1/c/{company_slug}/collector/{collector_uuid}/measurement/available

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: sapiente

collector   string   

The UUID of the collector Example: fugiat

Get Collector Lifecycle Timeline

requires authentication

Returns a chronological timeline of lifecycle events for a collector, including status changes, farm placements, handovers, and firmware changes.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/timeline" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/timeline"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/timeline',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/timeline'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/collector/{collector_uuid}/timeline

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: quia

collector   string   

The UUID of the collector Example: saepe

Update Collector Parameters

requires authentication

Update one or more parameters for a specific collector. This will update the local parameter values and send commands to the device to apply the changes.

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/parameters" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"parameters\": []
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/parameters"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "parameters": []
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/parameters',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'parameters' => [],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/parameters'
payload = {
    "parameters": []
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/c/{company_slug}/collector/{collector_uuid}/parameters

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: ut

collector   string   

The UUID of the collector Example: quia

Body Parameters

parameters   object   

Object containing parameter slugs as keys and their new values

Initiate Firmware Update

requires authentication

Assign a firmware version to a collector, record the assignment in the firmware history, and send the update command to the device via MQTT.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/firmware-update" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"firmwareTypeSlug\": \"firmware-v1.2.3\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/firmware-update"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "firmwareTypeSlug": "firmware-v1.2.3"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/firmware-update',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'firmwareTypeSlug' => 'firmware-v1.2.3',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/firmware-update'
payload = {
    "firmwareTypeSlug": "firmware-v1.2.3"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/collector/{collector_uuid}/firmware-update

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: non

collector   string   

The UUID of the collector Example: laborum

Body Parameters

firmwareTypeSlug   string   

The slug of the firmware type to assign. Example: firmware-v1.2.3

Broadcast Parameter Update

requires authentication

Send a single MQTT broadcast command to all child TCUs of an NCU, while storing parameters locally per-child-TCU.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/broadcast-parameters" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"parameters\": []
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/broadcast-parameters"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "parameters": []
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/broadcast-parameters',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'parameters' => [],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/broadcast-parameters'
payload = {
    "parameters": []
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/collector/{collector_uuid}/broadcast-parameters

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: commodi

collector   string   

The UUID of the NCU collector Example: aliquam

Body Parameters

parameters   object   

Key-value pairs of parameter slugs and their values

Move Collector to Farm

requires authentication

Move a collector to a different farm. This creates a new entry in the collector_farm_junctions table and deactivates the previous junction.

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/farm" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"farmSectionUuid\": \"550e8400-e29b-41d4-a716-446655440001\",
    \"row\": 3,
    \"column\": 5,
    \"widthM\": \"6.5\",
    \"heightM\": \"2.4\",
    \"angleDeg\": \"12.5\",
    \"copyCollectorLocation\": false
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/farm"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "farmSectionUuid": "550e8400-e29b-41d4-a716-446655440001",
    "row": 3,
    "column": 5,
    "widthM": "6.5",
    "heightM": "2.4",
    "angleDeg": "12.5",
    "copyCollectorLocation": false
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/farm',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'farmSectionUuid' => '550e8400-e29b-41d4-a716-446655440001',
            'row' => 3,
            'column' => 5,
            'widthM' => '6.5',
            'heightM' => '2.4',
            'angleDeg' => '12.5',
            'copyCollectorLocation' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/farm'
payload = {
    "farmSectionUuid": "550e8400-e29b-41d4-a716-446655440001",
    "row": 3,
    "column": 5,
    "widthM": "6.5",
    "heightM": "2.4",
    "angleDeg": "12.5",
    "copyCollectorLocation": false
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (200):


{
  "message": "Collector successfully moved to farm",
  "data": {
    "collector": { ... },
    "newFarm": { "uuid": "...", "name": "..." },
    "tracker": { ... }
  }
}
 

Example response (404):


{
    "error": "Target farm not found or does not belong to this company"
}
 

Request      

PATCH api/v1/c/{company_slug}/collector/{collector_uuid}/farm

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: deserunt

collector   string   

The UUID of the collector Example: corporis

Body Parameters

farmSectionUuid   string   

The UUID of the target farm section. Example: 550e8400-e29b-41d4-a716-446655440001

row   integer  optional  

optional The row position in the new farm. Example: 3

column   integer  optional  

optional The column position in the new farm. Example: 5

widthM   numeric  optional  

optional The collector width in meters. Example: 6.5

heightM   numeric  optional  

optional The collector height in meters. Example: 2.4

angleDeg   numeric  optional  

optional The placement angle in degrees. Example: 12.5

copyCollectorLocation   boolean  optional  

optional When true, copies the collector location into the new junction record. Example: false

Decommission a Collector

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/decommission" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"reason\": \"End of life — hardware fault\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/decommission"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "reason": "End of life — hardware fault"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/decommission',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'reason' => 'End of life — hardware fault',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/decommission'
payload = {
    "reason": "End of life — hardware fault"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/collector/{collector_uuid}/decommission

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: quidem

collector   string   

The UUID of the collector Example: modi

Body Parameters

reason   string  optional  

optional Reason for decommissioning. Example: End of life — hardware fault

Recommission a Decommissioned Collector

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/recommission" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/recommission"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/recommission',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/recommission'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/c/{company_slug}/collector/{collector_uuid}/recommission

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: ut

collector   string   

The UUID of the collector Example: architecto

Unassign a collector from its current farm.

requires authentication

Moves the collector to the company's unassigned farm/section and transitions its lifecycle status to 'unassigned'. For TCU collectors, the parent link is set to the system Holding NCU. For NCU collectors, the parent link is removed.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/unassign" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"reason\": \"Relocated to different site\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/unassign"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "reason": "Relocated to different site"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/unassign',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'reason' => 'Relocated to different site',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/unassign'
payload = {
    "reason": "Relocated to different site"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/collector/{collector_uuid}/unassign

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: aut

collector   string   

The UUID of the collector Example: dolorem

Body Parameters

reason   string  optional  

optional Reason for unassigning. Example: Relocated to different site

Handover a collector to a replacement collector while preserving tracker identity.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/handover" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"replacementCollectorUuid\": \"550e8400-e29b-41d4-a716-446655440123\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/handover"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "replacementCollectorUuid": "550e8400-e29b-41d4-a716-446655440123"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/handover',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'replacementCollectorUuid' => '550e8400-e29b-41d4-a716-446655440123',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/handover'
payload = {
    "replacementCollectorUuid": "550e8400-e29b-41d4-a716-446655440123"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/collector/{oldCollector_uuid}/handover

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

oldCollector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

Body Parameters

replacementCollectorUuid   string   

UUID of the collector that will replace the current collector at this tracker. Must be a valid UUID. The uuid of an existing record in the collectors table. Example: 550e8400-e29b-41d4-a716-446655440123

Swap a deployed/active collector with a replacement at the same farm position.

requires authentication

Unassigns the old collector from its farm position and places the replacement collector at the same farm, section, row, and column. The old collector is transitioned to 'unassigned' and the replacement is transitioned to 'deployed'.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/swap" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"replacementCollectorUuid\": \"550e8400-e29b-41d4-a716-446655440123\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/swap"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "replacementCollectorUuid": "550e8400-e29b-41d4-a716-446655440123"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/swap',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'replacementCollectorUuid' => '550e8400-e29b-41d4-a716-446655440123',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/swap'
payload = {
    "replacementCollectorUuid": "550e8400-e29b-41d4-a716-446655440123"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/collector/{collector_uuid}/swap

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: et

collector   string   

The UUID of the collector to swap out Example: eum

Body Parameters

replacementCollectorUuid   string   

UUID of the replacement collector. Example: 550e8400-e29b-41d4-a716-446655440123

Get Current Collector Firmware

requires authentication

Returns the currently assigned firmware for a collector.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/firmware" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/firmware"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/firmware',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/firmware'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/collector/{collector_uuid}/firmware

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: corrupti

collector   string   

The UUID of the collector Example: assumenda

Get Collector Firmware History

requires authentication

Returns the history of firmware assignments for a collector.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/firmware/history?page=1&perPage=15" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/firmware/history"
);

const params = {
    "page": "1",
    "perPage": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/firmware/history',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '15',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/firmware/history'
params = {
  'page': '1',
  'perPage': '15',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/collector/{collector_uuid}/firmware/history

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: et

collector   string   

The UUID of the collector Example: hic

Query Parameters

page   integer  optional  

Page number for pagination. Example: 1

perPage   integer  optional  

Number of items per page. Example: 15

Rename a tracker and lock it from automatic collector-name propagation.

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/c/tracklab/tracker/a205ee53-a5ce-4ecf-8103-d1ace6488432/name" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"North Row Tracker A2\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/tracker/a205ee53-a5ce-4ecf-8103-d1ace6488432/name"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "North Row Tracker A2"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/c/tracklab/tracker/a205ee53-a5ce-4ecf-8103-d1ace6488432/name',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'North Row Tracker A2',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/tracker/a205ee53-a5ce-4ecf-8103-d1ace6488432/name'
payload = {
    "name": "North Row Tracker A2"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/c/{company_slug}/tracker/{tracker_uuid}/name

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

tracker_uuid   string   

Example: a205ee53-a5ce-4ecf-8103-d1ace6488432

Body Parameters

name   string   

Tracker display name. Setting this locks the tracker name from collector rename propagation. Must not be greater than 255 characters. Example: North Row Tracker A2

List all warranties for a collector.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/warranty" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/warranty"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/warranty',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/warranty'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/collector/{collector_uuid}/warranty

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

File a warranty claim against a collector's warranty.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/warranty/claims" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"collectorWarrantyUuid\": \"550e8400-e29b-41d4-a716-446655440060\",
    \"description\": \"Actuator failed during normal operation within warranty period.\",
    \"coveredByWarranty\": true,
    \"cost\": 249.99,
    \"rmaRequestUuid\": \"550e8400-e29b-41d4-a716-446655440061\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/warranty/claims"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "collectorWarrantyUuid": "550e8400-e29b-41d4-a716-446655440060",
    "description": "Actuator failed during normal operation within warranty period.",
    "coveredByWarranty": true,
    "cost": 249.99,
    "rmaRequestUuid": "550e8400-e29b-41d4-a716-446655440061"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/warranty/claims',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'collectorWarrantyUuid' => '550e8400-e29b-41d4-a716-446655440060',
            'description' => 'Actuator failed during normal operation within warranty period.',
            'coveredByWarranty' => true,
            'cost' => 249.99,
            'rmaRequestUuid' => '550e8400-e29b-41d4-a716-446655440061',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/collector/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/warranty/claims'
payload = {
    "collectorWarrantyUuid": "550e8400-e29b-41d4-a716-446655440060",
    "description": "Actuator failed during normal operation within warranty period.",
    "coveredByWarranty": true,
    "cost": 249.99,
    "rmaRequestUuid": "550e8400-e29b-41d4-a716-446655440061"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/collector/{collector_uuid}/warranty/claims

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

Body Parameters

collectorWarrantyUuid   string   

UUID of the collector warranty this claim belongs to. Must be a valid UUID. The uuid of an existing record in the collector_warranties table. Example: 550e8400-e29b-41d4-a716-446655440060

description   string   

Summary of the warranty issue being claimed. Must not be greater than 5000 characters. Example: Actuator failed during normal operation within warranty period.

coveredByWarranty   boolean   

Whether the claim is expected to be covered under warranty terms. Example: true

cost   number  optional  

Optional estimated or invoiced claim amount. Must be at least 0. Example: 249.99

rmaRequestUuid   string  optional  

Optional related RMA request UUID. Must be a valid UUID. The uuid of an existing record in the rma_requests table. Example: 550e8400-e29b-41d4-a716-446655440061

requires authentication

Returns all company links granted by this company.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/links" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/links"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/links',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/links'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

requires authentication

Returns all company links received by this company.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/links/received" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/links/received"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/links/received',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/links/received'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

requires authentication

Creates a new company link with an invite for the receiving company.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/links" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"remoteCompanySlug\": \"acme-corp\",
    \"roles\": {
        \"companyWide\": [
            \"technician\"
        ],
        \"farms\": [
            {
                \"farmUuid\": \"f4314a78-8e41-368f-86ca-1d5b02d70f6a\",
                \"roles\": [
                    \"external-support\"
                ]
            }
        ],
        \"collectors\": [
            {
                \"collectorUuid\": \"71a04715-da40-33ce-a232-189424d6d6f9\",
                \"roles\": [
                    \"external-supplier\"
                ]
            }
        ]
    },
    \"validUntil\": \"2026-12-31\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/links"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "remoteCompanySlug": "acme-corp",
    "roles": {
        "companyWide": [
            "technician"
        ],
        "farms": [
            {
                "farmUuid": "f4314a78-8e41-368f-86ca-1d5b02d70f6a",
                "roles": [
                    "external-support"
                ]
            }
        ],
        "collectors": [
            {
                "collectorUuid": "71a04715-da40-33ce-a232-189424d6d6f9",
                "roles": [
                    "external-supplier"
                ]
            }
        ]
    },
    "validUntil": "2026-12-31"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/links',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'remoteCompanySlug' => 'acme-corp',
            'roles' => [
                'companyWide' => [
                    'technician',
                ],
                'farms' => [
                    [
                        'farmUuid' => 'f4314a78-8e41-368f-86ca-1d5b02d70f6a',
                        'roles' => [
                            'external-support',
                        ],
                    ],
                ],
                'collectors' => [
                    [
                        'collectorUuid' => '71a04715-da40-33ce-a232-189424d6d6f9',
                        'roles' => [
                            'external-supplier',
                        ],
                    ],
                ],
            ],
            'validUntil' => '2026-12-31',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/links'
payload = {
    "remoteCompanySlug": "acme-corp",
    "roles": {
        "companyWide": [
            "technician"
        ],
        "farms": [
            {
                "farmUuid": "f4314a78-8e41-368f-86ca-1d5b02d70f6a",
                "roles": [
                    "external-support"
                ]
            }
        ],
        "collectors": [
            {
                "collectorUuid": "71a04715-da40-33ce-a232-189424d6d6f9",
                "roles": [
                    "external-supplier"
                ]
            }
        ]
    },
    "validUntil": "2026-12-31"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

requires authentication

Returns details of a specific company link.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/links/43f95020-2337-35d1-9a5a-cbe1a3fd5d53" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/links/43f95020-2337-35d1-9a5a-cbe1a3fd5d53"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/links/43f95020-2337-35d1-9a5a-cbe1a3fd5d53',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/links/43f95020-2337-35d1-9a5a-cbe1a3fd5d53'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

requires authentication

Updates a company link status (suspend/reactivate).

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/c/tracklab/links/25ba4892-4dcb-37dc-bb8f-1261d2f36b49" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"status\": \"active\",
    \"validUntil\": \"2026-12-31\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/links/25ba4892-4dcb-37dc-bb8f-1261d2f36b49"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "status": "active",
    "validUntil": "2026-12-31"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/c/tracklab/links/25ba4892-4dcb-37dc-bb8f-1261d2f36b49',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'status' => 'active',
            'validUntil' => '2026-12-31',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/links/25ba4892-4dcb-37dc-bb8f-1261d2f36b49'
payload = {
    "status": "active",
    "validUntil": "2026-12-31"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

requires authentication

Terminates a company link. Either company can unlink.

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/links/1007809d-7370-3359-ab07-e5b93750188d" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/links/1007809d-7370-3359-ab07-e5b93750188d"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/links/1007809d-7370-3359-ab07-e5b93750188d',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/links/1007809d-7370-3359-ab07-e5b93750188d'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/links/bbb6720c-0d9a-3404-9f69-e3ff1fb2eccc/roles" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"roleSlug\": \"user\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/links/bbb6720c-0d9a-3404-9f69-e3ff1fb2eccc/roles"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "roleSlug": "user"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/links/bbb6720c-0d9a-3404-9f69-e3ff1fb2eccc/roles',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'roleSlug' => 'user',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/links/bbb6720c-0d9a-3404-9f69-e3ff1fb2eccc/roles'
payload = {
    "roleSlug": "user"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/links/a33b1796-955d-33f0-86fe-ac3fedc10039/roles/molestias" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/links/a33b1796-955d-33f0-86fe-ac3fedc10039/roles/molestias"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/links/a33b1796-955d-33f0-86fe-ac3fedc10039/roles/molestias',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/links/a33b1796-955d-33f0-86fe-ac3fedc10039/roles/molestias'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/links/efdbf07f-6a4f-3ea8-a244-3206f5af660f/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/roles" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"roleSlug\": \"user\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/links/efdbf07f-6a4f-3ea8-a244-3206f5af660f/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/roles"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "roleSlug": "user"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/links/efdbf07f-6a4f-3ea8-a244-3206f5af660f/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/roles',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'roleSlug' => 'user',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/links/efdbf07f-6a4f-3ea8-a244-3206f5af660f/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/roles'
payload = {
    "roleSlug": "user"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/links/1685528d-c320-3bc3-8647-feef069fa3bb/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/roles/sit" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/links/1685528d-c320-3bc3-8647-feef069fa3bb/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/roles/sit"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/links/1685528d-c320-3bc3-8647-feef069fa3bb/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/roles/sit',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/links/1685528d-c320-3bc3-8647-feef069fa3bb/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/roles/sit'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/links/720d5e90-e94d-38f3-b93c-fe1ca030800c/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/roles" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"roleSlug\": \"user\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/links/720d5e90-e94d-38f3-b93c-fe1ca030800c/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/roles"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "roleSlug": "user"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/links/720d5e90-e94d-38f3-b93c-fe1ca030800c/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/roles',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'roleSlug' => 'user',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/links/720d5e90-e94d-38f3-b93c-fe1ca030800c/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/roles'
payload = {
    "roleSlug": "user"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/links/113df914-a49c-3aef-979f-dfc9fbc03a77/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/roles/vitae" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/links/113df914-a49c-3aef-979f-dfc9fbc03a77/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/roles/vitae"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/links/113df914-a49c-3aef-979f-dfc9fbc03a77/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/roles/vitae',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/links/113df914-a49c-3aef-979f-dfc9fbc03a77/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/roles/vitae'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

requires authentication

Returns all pending company link invites for this company (as receiving company).

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/link-invites" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/link-invites"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/link-invites',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/link-invites'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

requires authentication

Accepts a pending company link invite, activating the link.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/link-invites/04300bc1-44ad-3550-9db5-190033241964/accept" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/link-invites/04300bc1-44ad-3550-9db5-190033241964/accept"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/link-invites/04300bc1-44ad-3550-9db5-190033241964/accept',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/link-invites/04300bc1-44ad-3550-9db5-190033241964/accept'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

requires authentication

Rejects a pending company link invite.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/link-invites/4e2cb1d1-f210-3a52-be64-eb97885b73ab/reject" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/link-invites/4e2cb1d1-f210-3a52-be64-eb97885b73ab/reject"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/link-invites/4e2cb1d1-f210-3a52-be64-eb97885b73ab/reject',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/link-invites/4e2cb1d1-f210-3a52-be64-eb97885b73ab/reject'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

GET api/v1/c/{company_slug}/device-groups

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/rerum/device-groups" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/rerum/device-groups"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/rerum/device-groups',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/rerum/device-groups'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/device-groups

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: rerum

POST api/v1/c/{company_slug}/device-groups

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/suscipit/device-groups" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Section A Collectors\",
    \"description\": \"All collectors in section A of the farm\",
    \"targetFilters\": {
        \"deviceModelTypeSlugs\": [
            \"ncu-v2\",
            \"tcu-v1\"
        ],
        \"farmUuids\": [
            \"550e8400-e29b-41d4-a716-446655440000\"
        ],
        \"siteUuids\": [
            \"984b3865-4d54-3e6e-9c31-ae1cfdcf39f7\"
        ],
        \"collectorUuids\": [
            \"a921fdb8-b8db-3a7e-bad4-6423c5427596\"
        ],
        \"excludeCollectorUuids\": [
            \"2bf97750-942b-31ad-a619-c5b456543129\"
        ]
    },
    \"collectorUuids\": [
        \"288f43cb-6d11-3094-ad33-6c065b233e8f\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/suscipit/device-groups"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Section A Collectors",
    "description": "All collectors in section A of the farm",
    "targetFilters": {
        "deviceModelTypeSlugs": [
            "ncu-v2",
            "tcu-v1"
        ],
        "farmUuids": [
            "550e8400-e29b-41d4-a716-446655440000"
        ],
        "siteUuids": [
            "984b3865-4d54-3e6e-9c31-ae1cfdcf39f7"
        ],
        "collectorUuids": [
            "a921fdb8-b8db-3a7e-bad4-6423c5427596"
        ],
        "excludeCollectorUuids": [
            "2bf97750-942b-31ad-a619-c5b456543129"
        ]
    },
    "collectorUuids": [
        "288f43cb-6d11-3094-ad33-6c065b233e8f"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/suscipit/device-groups',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Section A Collectors',
            'description' => 'All collectors in section A of the farm',
            'targetFilters' => [
                'deviceModelTypeSlugs' => [
                    'ncu-v2',
                    'tcu-v1',
                ],
                'farmUuids' => [
                    '550e8400-e29b-41d4-a716-446655440000',
                ],
                'siteUuids' => [
                    '984b3865-4d54-3e6e-9c31-ae1cfdcf39f7',
                ],
                'collectorUuids' => [
                    'a921fdb8-b8db-3a7e-bad4-6423c5427596',
                ],
                'excludeCollectorUuids' => [
                    '2bf97750-942b-31ad-a619-c5b456543129',
                ],
            ],
            'collectorUuids' => [
                '288f43cb-6d11-3094-ad33-6c065b233e8f',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/suscipit/device-groups'
payload = {
    "name": "Section A Collectors",
    "description": "All collectors in section A of the farm",
    "targetFilters": {
        "deviceModelTypeSlugs": [
            "ncu-v2",
            "tcu-v1"
        ],
        "farmUuids": [
            "550e8400-e29b-41d4-a716-446655440000"
        ],
        "siteUuids": [
            "984b3865-4d54-3e6e-9c31-ae1cfdcf39f7"
        ],
        "collectorUuids": [
            "a921fdb8-b8db-3a7e-bad4-6423c5427596"
        ],
        "excludeCollectorUuids": [
            "2bf97750-942b-31ad-a619-c5b456543129"
        ]
    },
    "collectorUuids": [
        "288f43cb-6d11-3094-ad33-6c065b233e8f"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/device-groups

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: suscipit

Body Parameters

name   string   

Device group name (unique per company). Must not be greater than 255 characters. Example: Section A Collectors

description   string  optional  

Description of the device group. Example: All collectors in section A of the farm

targetFilters   object  optional  

Filters to auto-select collectors.

deviceModelTypeSlugs   string[]  optional  

The slug of an existing record in the device_model_types table.

farmUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the farms table.

siteUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the sites table.

collectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

excludeCollectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

collectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

GET api/v1/c/{company_slug}/device-groups/{deviceGroup_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/device-groups/{deviceGroup_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceGroup_uuid   string   

Example: a2f63e5f-8488-4b5f-a10e-04616e26f78d

PUT api/v1/c/{company_slug}/device-groups/{deviceGroup_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Section A Collectors Updated\",
    \"description\": \"Updated collectors in section A\",
    \"targetFilters\": {
        \"deviceModelTypeSlugs\": [
            \"ncu-v2\",
            \"tcu-v1\",
            \"ncu-v3\"
        ],
        \"farmUuids\": [
            \"550e8400-e29b-41d4-a716-446655440000\",
            \"550e8400-e29b-41d4-a716-446655440001\"
        ],
        \"siteUuids\": [
            \"cbce6330-3a7d-331a-8ad9-322dea2ffb6c\"
        ],
        \"collectorUuids\": [
            \"351d3c86-082f-3c98-8775-8bc174d5a208\"
        ],
        \"excludeCollectorUuids\": [
            \"16dc09f0-9863-388c-89ea-d5c5ebd6d3f2\"
        ]
    },
    \"collectorUuids\": [
        \"f49077c5-5af9-3159-b80e-b4dd07ab3710\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Section A Collectors Updated",
    "description": "Updated collectors in section A",
    "targetFilters": {
        "deviceModelTypeSlugs": [
            "ncu-v2",
            "tcu-v1",
            "ncu-v3"
        ],
        "farmUuids": [
            "550e8400-e29b-41d4-a716-446655440000",
            "550e8400-e29b-41d4-a716-446655440001"
        ],
        "siteUuids": [
            "cbce6330-3a7d-331a-8ad9-322dea2ffb6c"
        ],
        "collectorUuids": [
            "351d3c86-082f-3c98-8775-8bc174d5a208"
        ],
        "excludeCollectorUuids": [
            "16dc09f0-9863-388c-89ea-d5c5ebd6d3f2"
        ]
    },
    "collectorUuids": [
        "f49077c5-5af9-3159-b80e-b4dd07ab3710"
    ]
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Section A Collectors Updated',
            'description' => 'Updated collectors in section A',
            'targetFilters' => [
                'deviceModelTypeSlugs' => [
                    'ncu-v2',
                    'tcu-v1',
                    'ncu-v3',
                ],
                'farmUuids' => [
                    '550e8400-e29b-41d4-a716-446655440000',
                    '550e8400-e29b-41d4-a716-446655440001',
                ],
                'siteUuids' => [
                    'cbce6330-3a7d-331a-8ad9-322dea2ffb6c',
                ],
                'collectorUuids' => [
                    '351d3c86-082f-3c98-8775-8bc174d5a208',
                ],
                'excludeCollectorUuids' => [
                    '16dc09f0-9863-388c-89ea-d5c5ebd6d3f2',
                ],
            ],
            'collectorUuids' => [
                'f49077c5-5af9-3159-b80e-b4dd07ab3710',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d'
payload = {
    "name": "Section A Collectors Updated",
    "description": "Updated collectors in section A",
    "targetFilters": {
        "deviceModelTypeSlugs": [
            "ncu-v2",
            "tcu-v1",
            "ncu-v3"
        ],
        "farmUuids": [
            "550e8400-e29b-41d4-a716-446655440000",
            "550e8400-e29b-41d4-a716-446655440001"
        ],
        "siteUuids": [
            "cbce6330-3a7d-331a-8ad9-322dea2ffb6c"
        ],
        "collectorUuids": [
            "351d3c86-082f-3c98-8775-8bc174d5a208"
        ],
        "excludeCollectorUuids": [
            "16dc09f0-9863-388c-89ea-d5c5ebd6d3f2"
        ]
    },
    "collectorUuids": [
        "f49077c5-5af9-3159-b80e-b4dd07ab3710"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/c/{company_slug}/device-groups/{deviceGroup_uuid}

PATCH api/v1/c/{company_slug}/device-groups/{deviceGroup_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceGroup_uuid   string   

Example: a2f63e5f-8488-4b5f-a10e-04616e26f78d

Body Parameters

name   string  optional  

Device group name (unique per company). Must not be greater than 255 characters. Example: Section A Collectors Updated

description   string  optional  

Description of the device group. Example: Updated collectors in section A

targetFilters   object  optional  

Filters to auto-select collectors.

deviceModelTypeSlugs   string[]  optional  

The slug of an existing record in the device_model_types table.

farmUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the farms table.

siteUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the sites table.

collectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

excludeCollectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

collectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

DELETE api/v1/c/{company_slug}/device-groups/{deviceGroup_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/device-groups/{deviceGroup_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceGroup_uuid   string   

Example: a2f63e5f-8488-4b5f-a10e-04616e26f78d

POST api/v1/c/{company_slug}/device-groups/{deviceGroup_uuid}/collectors

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d/collectors" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"action\": \"add\",
    \"collectorUuids\": [
        \"c251451e-23b1-36ea-a18a-fe9fb2f4ced4\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d/collectors"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "action": "add",
    "collectorUuids": [
        "c251451e-23b1-36ea-a18a-fe9fb2f4ced4"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d/collectors',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'action' => 'add',
            'collectorUuids' => [
                'c251451e-23b1-36ea-a18a-fe9fb2f4ced4',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d/collectors'
payload = {
    "action": "add",
    "collectorUuids": [
        "c251451e-23b1-36ea-a18a-fe9fb2f4ced4"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/device-groups/{deviceGroup_uuid}/collectors

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceGroup_uuid   string   

Example: a2f63e5f-8488-4b5f-a10e-04616e26f78d

Body Parameters

action   string   

Action to perform: add or remove collectors. Example: add

collectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

GET api/v1/c/{company_slug}/device-models

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/device-models" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/device-models"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/device-models',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/device-models'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/device-models

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

POST api/v1/c/{company_slug}/device-models

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/device-models" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"NCU v2.0\",
    \"slug\": \"ncu-v2\",
    \"description\": \"Network Control Unit version 2.0 with enhanced capabilities\",
    \"manufacturer\": \"TrackLab\",
    \"collectorTypeSlug\": \"ncu\",
    \"hardwareVersions\": [
        \"fsxglmdifknysknnikzrqlhfq\"
    ],
    \"enabled\": true,
    \"orderColumn\": 1
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/device-models"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "NCU v2.0",
    "slug": "ncu-v2",
    "description": "Network Control Unit version 2.0 with enhanced capabilities",
    "manufacturer": "TrackLab",
    "collectorTypeSlug": "ncu",
    "hardwareVersions": [
        "fsxglmdifknysknnikzrqlhfq"
    ],
    "enabled": true,
    "orderColumn": 1
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/device-models',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'NCU v2.0',
            'slug' => 'ncu-v2',
            'description' => 'Network Control Unit version 2.0 with enhanced capabilities',
            'manufacturer' => 'TrackLab',
            'collectorTypeSlug' => 'ncu',
            'hardwareVersions' => [
                'fsxglmdifknysknnikzrqlhfq',
            ],
            'enabled' => true,
            'orderColumn' => 1,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/device-models'
payload = {
    "name": "NCU v2.0",
    "slug": "ncu-v2",
    "description": "Network Control Unit version 2.0 with enhanced capabilities",
    "manufacturer": "TrackLab",
    "collectorTypeSlug": "ncu",
    "hardwareVersions": [
        "fsxglmdifknysknnikzrqlhfq"
    ],
    "enabled": true,
    "orderColumn": 1
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/device-models

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

name   string   

Name of the device model type. Must not be greater than 255 characters. Example: NCU v2.0

slug   string  optional  

URL-friendly identifier (auto-generated if not provided). Must not be greater than 255 characters. Example: ncu-v2

description   string  optional  

Description of the device model type. Example: Network Control Unit version 2.0 with enhanced capabilities

manufacturer   string  optional  

Manufacturer name. Must not be greater than 255 characters. Example: TrackLab

collectorTypeSlug   string  optional  

Slug of the associated collector type. The slug of an existing record in the collector_types table. Example: ncu

hardwareVersions   string[]  optional  

Must not be greater than 50 characters.

capabilities   string[]  optional  
enabled   boolean  optional  

Whether the device model type is enabled. Example: true

orderColumn   integer  optional  

Display order. Must be at least 0. Example: 1

GET api/v1/c/{company_slug}/device-models/{deviceModelType_slug}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/device-models/{deviceModelType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceModelType_slug   string   

The slug of the deviceModelType. Example: unknown

PUT api/v1/c/{company_slug}/device-models/{deviceModelType_slug}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"NCU v2.0\",
    \"slug\": \"ncu-v2\",
    \"description\": \"Network Control Unit version 2.0 with enhanced capabilities\",
    \"manufacturer\": \"TrackLab\",
    \"collectorTypeSlug\": \"ncu\",
    \"hardwareVersions\": [
        \"lwos\"
    ],
    \"enabled\": true,
    \"orderColumn\": 1
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "NCU v2.0",
    "slug": "ncu-v2",
    "description": "Network Control Unit version 2.0 with enhanced capabilities",
    "manufacturer": "TrackLab",
    "collectorTypeSlug": "ncu",
    "hardwareVersions": [
        "lwos"
    ],
    "enabled": true,
    "orderColumn": 1
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'NCU v2.0',
            'slug' => 'ncu-v2',
            'description' => 'Network Control Unit version 2.0 with enhanced capabilities',
            'manufacturer' => 'TrackLab',
            'collectorTypeSlug' => 'ncu',
            'hardwareVersions' => [
                'lwos',
            ],
            'enabled' => true,
            'orderColumn' => 1,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown'
payload = {
    "name": "NCU v2.0",
    "slug": "ncu-v2",
    "description": "Network Control Unit version 2.0 with enhanced capabilities",
    "manufacturer": "TrackLab",
    "collectorTypeSlug": "ncu",
    "hardwareVersions": [
        "lwos"
    ],
    "enabled": true,
    "orderColumn": 1
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/c/{company_slug}/device-models/{deviceModelType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceModelType_slug   string   

The slug of the deviceModelType. Example: unknown

Body Parameters

name   string  optional  

Name of the device model type. Must not be greater than 255 characters. Example: NCU v2.0

slug   string  optional  

URL-friendly identifier. Must not be greater than 255 characters. Example: ncu-v2

description   string  optional  

Description of the device model type. Example: Network Control Unit version 2.0 with enhanced capabilities

manufacturer   string  optional  

Manufacturer name. Must not be greater than 255 characters. Example: TrackLab

collectorTypeSlug   string  optional  

Slug of the associated collector type. The slug of an existing record in the collector_types table. Example: ncu

hardwareVersions   string[]  optional  

Must not be greater than 50 characters.

capabilities   string[]  optional  
enabled   boolean  optional  

Whether the device model type is enabled. Example: true

orderColumn   integer  optional  

Display order. Must be at least 0. Example: 1

PUT api/v1/c/{company_slug}/device-models/{deviceModelType_slug}/toggle

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown/toggle" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"enabled\": false
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown/toggle"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "enabled": false
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown/toggle',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'enabled' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown/toggle'
payload = {
    "enabled": false
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/c/{company_slug}/device-models/{deviceModelType_slug}/toggle

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceModelType_slug   string   

The slug of the deviceModelType. Example: unknown

Body Parameters

enabled   boolean   

Example: false

DELETE api/v1/c/{company_slug}/device-models/{deviceModelType_slug}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/device-models/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/device-models/{deviceModelType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceModelType_slug   string   

The slug of the deviceModelType. Example: unknown

Get All Farms

requires authentication

Retrieve all farms associated with the company.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/dolorem/farm" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/dolorem/farm"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/dolorem/farm',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/dolorem/farm'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "uuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
            "createdAt": "2024-01-03T20:11:13+00:00",
            "updatedAt": "2024-01-03T20:11:13+00:00",
            "enabled": true,
            "companySlug": "tracklab",
            "name": "First Farm",
            "description": "",
            "location": {
                "lat": -25.91,
                "lng": 28.12
            },
            "isUnassigned": false
        },
        {
            "uuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
            "createdAt": "2024-01-03T20:11:13+00:00",
            "updatedAt": "2024-01-03T20:11:13+00:00",
            "enabled": true,
            "companySlug": "tracklab",
            "name": "First Farm",
            "description": "",
            "location": {
                "lat": -25.91,
                "lng": 28.12
            },
            "isUnassigned": false
        }
    ]
}
 

Request      

GET api/v1/c/{company_slug}/farm

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: dolorem

Response

Response Fields

data   object   
uuid   string   

The unique identifier of the farm

createdAt   string   

The timestamp when the farm was created

updatedAt   string   

The timestamp when the farm was last updated

enabled   boolean   

Whether the farm is enabled

companySlug   string   

The slug of the company this farm belongs to

name   string   

The name of the farm

description   string|null   

The description of the farm

location   object   

The location coordinates

lat   number   

The latitude coordinate

lng   number   

The longitude coordinate

Add New Farm

requires authentication

Create a new farm for the company.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/incidunt/farm" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"North Field Farm\",
    \"description\": \"Main production farm\",
    \"location\": {
        \"latitude\": \"51.509865\",
        \"longitude\": \"-0.118092\"
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/incidunt/farm"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "North Field Farm",
    "description": "Main production farm",
    "location": {
        "latitude": "51.509865",
        "longitude": "-0.118092"
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/incidunt/farm',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'North Field Farm',
            'description' => 'Main production farm',
            'location' => [
                'latitude' => '51.509865',
                'longitude' => '-0.118092',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/incidunt/farm'
payload = {
    "name": "North Field Farm",
    "description": "Main production farm",
    "location": {
        "latitude": "51.509865",
        "longitude": "-0.118092"
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
        "createdAt": "2024-01-03T20:11:13+00:00",
        "updatedAt": "2024-01-03T20:11:13+00:00",
        "enabled": true,
        "companySlug": "tracklab",
        "name": "First Farm",
        "description": "",
        "location": {
            "lat": -25.91,
            "lng": 28.12
        },
        "isUnassigned": false
    }
}
 

Request      

POST api/v1/c/{company_slug}/farm

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: incidunt

Body Parameters

name   string   

The name of the farm. Example: North Field Farm

description   string  optional  

The description of the farm. Example: Main production farm

location   object  optional  
latitude   numeric   

The latitude coordinate between -90 and 90. Example: 51.509865

longitude   numeric   

The longitude coordinate between -180 and 180. Example: -0.118092

Response

Response Fields

data   object   
uuid   string   

The unique identifier of the farm

createdAt   string   

The timestamp when the farm was created

updatedAt   string   

The timestamp when the farm was last updated

enabled   boolean   

Whether the farm is enabled

companySlug   string   

The slug of the company this farm belongs to

name   string   

The name of the farm

description   string|null   

The description of the farm

location   object   

The location coordinates

lat   number   

The latitude coordinate

lng   number   

The longitude coordinate

Get Farm Details

requires authentication

Retrieve details of a specific farm.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "uuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
        "createdAt": "2024-01-03T20:11:13+00:00",
        "updatedAt": "2024-01-03T20:11:13+00:00",
        "enabled": true,
        "companySlug": "tracklab",
        "name": "First Farm",
        "description": "",
        "location": {
            "lat": -25.91,
            "lng": 28.12
        },
        "isUnassigned": false
    }
}
 

Request      

GET api/v1/c/{company_slug}/farm/{farm_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

company   string   

The slug of the company Example: incidunt

farm   string   

The UUID of the farm Example: temporibus

Response

Response Fields

data   object   
uuid   string   

The unique identifier of the farm

createdAt   string   

The timestamp when the farm was created

updatedAt   string   

The timestamp when the farm was last updated

enabled   boolean   

Whether the farm is enabled

companySlug   string   

The slug of the company this farm belongs to

name   string   

The name of the farm

description   string|null   

The description of the farm

location   object   

The location coordinates

lat   number   

The latitude coordinate

lng   number   

The longitude coordinate

Update Farm

requires authentication

Update an existing farm's details.

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"North Field Farm\",
    \"description\": \"Main production farm\",
    \"location\": {
        \"latitude\": \"51.509865\",
        \"longitude\": \"-0.118092\"
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "North Field Farm",
    "description": "Main production farm",
    "location": {
        "latitude": "51.509865",
        "longitude": "-0.118092"
    }
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'North Field Farm',
            'description' => 'Main production farm',
            'location' => [
                'latitude' => '51.509865',
                'longitude' => '-0.118092',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b'
payload = {
    "name": "North Field Farm",
    "description": "Main production farm",
    "location": {
        "latitude": "51.509865",
        "longitude": "-0.118092"
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "name": "Updated Farm Name",
        "description": "Updated farm description",
        "location": {
            "latitude": 51.509865,
            "longitude": -0.118092
        },
        "created_at": "2024-01-20T12:00:00Z",
        "updated_at": "2024-01-20T12:00:00Z"
    }
}
 

Request      

PUT api/v1/c/{company_slug}/farm/{farm_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

company   string   

The slug of the company Example: est

farm   string   

The UUID of the farm Example: adipisci

Body Parameters

name   string   

The name of the farm. Example: North Field Farm

description   string  optional  

The description of the farm. Example: Main production farm

location   object  optional  
latitude   numeric   

The latitude coordinate between -90 and 90. Example: 51.509865

longitude   numeric   

The longitude coordinate between -180 and 180. Example: -0.118092

Get Farm Collectors

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/collector" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/collector"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/collector',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/collector'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "uuid": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
            "createdAt": "2026-02-12T13:40:48+00:00",
            "updatedAt": "2026-02-12T13:40:48+00:00",
            "enabled": true,
            "companySlug": "tracklab",
            "farmUuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
            "collectorTypeSlug": "ncu",
            "type": "NCU",
            "parentUuid": null,
            "childrenUuids": [],
            "serial": "SYSTEM-HOLDING-NCU",
            "name": "Unassigned Collectors",
            "description": "System-level holding NCU for auto-subscribed collectors awaiting assignment",
            "location": null,
            "isDecommissioned": false,
            "decommissionedAt": null,
            "decommissionReason": null,
            "currentTracker": null,
            "status": null,
            "hardwareVersion": null,
            "currentFirmware": null,
            "manufacturedAt": null,
            "deployedAt": null,
            "retiredAt": null
        },
        {
            "uuid": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
            "createdAt": "2026-02-12T13:40:48+00:00",
            "updatedAt": "2026-02-12T13:40:48+00:00",
            "enabled": true,
            "companySlug": "tracklab",
            "farmUuid": "c9b4c54e-a135-4a7f-86c9-7f03b9329a1b",
            "collectorTypeSlug": "ncu",
            "type": "NCU",
            "parentUuid": null,
            "childrenUuids": [],
            "serial": "SYSTEM-HOLDING-NCU",
            "name": "Unassigned Collectors",
            "description": "System-level holding NCU for auto-subscribed collectors awaiting assignment",
            "location": null,
            "isDecommissioned": false,
            "decommissionedAt": null,
            "decommissionReason": null,
            "currentTracker": null,
            "status": null,
            "hardwareVersion": null,
            "currentFirmware": null,
            "manufacturedAt": null,
            "deployedAt": null,
            "retiredAt": null
        }
    ]
}
 

Request      

GET api/v1/c/{company_slug}/farm/{farm_uuid}/collector

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

Response

Response Fields

data   object   
uuid   string   

The unique identifier of the collector

createdAt   string   

The creation timestamp (ISO8601)

updatedAt   string   

The last update timestamp (ISO8601)

enabled   boolean   

Whether the collector is enabled

companySlug   string   

The slug of the company this collector belongs to

farmUuid   string   

The UUID of the farm this collector belongs to

collectorTypeSlug   string   

The slug of the collector type

type   string   

The type of collector (NCU or TCU)

parentUuid   string|null   

The UUID of the parent collector (for TCUs)

childrenUuids   string[]   

Array of child collector UUIDs (for NCUs)

serial   string   

The serial number of the collector

name   string   

The name of the collector

description   string|null   

The description of the collector

location   object   

The location coordinates

lat   number   

The latitude coordinate

lng   number   

The longitude coordinate

isDecommissioned   boolean   

Whether the collector is decommissioned

decommissionedAt   string|null   

The decommission timestamp (ISO8601)

decommissionReason   string|null   

The reason for decommission

currentTracker   object|null   

The current tracker placement

uuid   string   

The tracker UUID

farmSectionUuid   string|null   

The farm section UUID

row   integer   

Row position in layout

column   integer   

Column position in layout

status   object|null   

The current lifecycle status

slug   string   

The status type slug

name   string   

The status type display name

hardwareVersion   object|null   

The hardware version type

slug   string   

The hardware version slug

name   string   

The hardware version display name

version   string|null   

The hardware version string

currentFirmware   object|null   

The current firmware information

slug   string   

The firmware type slug

name   string   

The firmware type display name

version   string|null   

The firmware version string

manufacturedAt   string|null   

The manufacture timestamp (ISO8601)

deployedAt   string|null   

The deployment timestamp (ISO8601)

retiredAt   string|null   

The retirement timestamp (ISO8601)

List sections for a farm

requires authentication

Returns paginated list of sections for a farm belonging to the company. Use this to get section UUIDs when moving collectors.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections?enabled_only=1&page=1&perPage=25" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections"
);

const params = {
    "enabled_only": "1",
    "page": "1",
    "perPage": "25",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'enabled_only' => '1',
            'page' => '1',
            'perPage' => '25',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections'
params = {
  'enabled_only': '1',
  'page': '1',
  'perPage': '25',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "data": [
        {
            "uuid": "147594ba-6f75-4b06-9daf-4c9dc58b34c1",
            "name": "Unassigned",
            "description": "",
            "enabled": true,
            "orderColumn": 0,
            "location": null,
            "locationJson": null,
            "metadata": null,
            "createdAt": "2026-01-14T19:48:46+00:00",
            "updatedAt": "2026-01-16T10:41:36+00:00",
            "isUnassigned": true
        },
        {
            "uuid": "147594ba-6f75-4b06-9daf-4c9dc58b34c1",
            "name": "Unassigned",
            "description": "",
            "enabled": true,
            "orderColumn": 0,
            "location": null,
            "locationJson": null,
            "metadata": null,
            "createdAt": "2026-01-14T19:48:46+00:00",
            "updatedAt": "2026-01-16T10:41:36+00:00",
            "isUnassigned": true
        }
    ]
}
 

Request      

GET api/v1/c/{company_slug}/farm/{farm_uuid}/sections

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

company   string   

The slug of the company. Example: tracklab

farm   string   

The UUID of the farm. Example: 550e8400-e29b-41d4-a716-446655440000

Query Parameters

enabled_only   boolean  optional  

Filter to only enabled sections. Example: true

page   integer  optional  

Page number. Example: 1

perPage   integer  optional  

Results per page (max 100). Example: 25

Create a new farm section

requires authentication

Creates a section within a specific farm. Requires FARM_UPDATE permission.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"North Field\",
    \"description\": \"Northern section of the farm\",
    \"enabled\": true,
    \"orderColumn\": 1,
    \"locationJson\": {
        \"latitude\": 51.509865,
        \"longitude\": -0.118092
    },
    \"metadata\": {
        \"notes\": \"Primary section\"
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "North Field",
    "description": "Northern section of the farm",
    "enabled": true,
    "orderColumn": 1,
    "locationJson": {
        "latitude": 51.509865,
        "longitude": -0.118092
    },
    "metadata": {
        "notes": "Primary section"
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'North Field',
            'description' => 'Northern section of the farm',
            'enabled' => true,
            'orderColumn' => 1,
            'locationJson' => [
                'latitude' => 51.509865,
                'longitude' => -0.118092,
            ],
            'metadata' => [
                'notes' => 'Primary section',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections'
payload = {
    "name": "North Field",
    "description": "Northern section of the farm",
    "enabled": true,
    "orderColumn": 1,
    "locationJson": {
        "latitude": 51.509865,
        "longitude": -0.118092
    },
    "metadata": {
        "notes": "Primary section"
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "147594ba-6f75-4b06-9daf-4c9dc58b34c1",
        "name": "Unassigned",
        "description": "",
        "enabled": true,
        "orderColumn": 0,
        "location": null,
        "locationJson": null,
        "metadata": null,
        "createdAt": "2026-01-14T19:48:46+00:00",
        "updatedAt": "2026-01-16T10:41:36+00:00",
        "isUnassigned": true
    }
}
 

Request      

POST api/v1/c/{company_slug}/farm/{farm_uuid}/sections

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

company   string   

The slug of the company. Example: tracklab

farm   string   

The UUID of the farm. Example: 550e8400-e29b-41d4-a716-446655440000

Body Parameters

name   string   

The name of the section. Example: North Field

slug   string  optional  
description   string  optional  

The description. Example: Northern section of the farm

enabled   boolean  optional  

Whether section is enabled. Example: true

orderColumn   integer  optional  

Display order. Example: 1

locationJson   object  optional  

Location coordinates.

latitude   number  optional  

This field is required when locationJson is present. Must be between -90 and 90. Example: 51.509865

longitude   number  optional  

This field is required when locationJson is present. Must be between -180 and 180. Example: -0.118092

metadata   object  optional  

Optional metadata.

POST api/v1/c/{company_slug}/firmware-keys/workflows/provision

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/workflows/provision" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Production Farm Key\",
    \"description\": \"Key for firmware updates on production farm\",
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440000\",
    \"expiresAt\": \"2025-12-31\",
    \"isActive\": true,
    \"plainKey\": \"abc123def456ghi789jkl012\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/workflows/provision"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Production Farm Key",
    "description": "Key for firmware updates on production farm",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440000",
    "expiresAt": "2025-12-31",
    "isActive": true,
    "plainKey": "abc123def456ghi789jkl012"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/workflows/provision',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Production Farm Key',
            'description' => 'Key for firmware updates on production farm',
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'expiresAt' => '2025-12-31',
            'isActive' => true,
            'plainKey' => 'abc123def456ghi789jkl012',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/workflows/provision'
payload = {
    "name": "Production Farm Key",
    "description": "Key for firmware updates on production farm",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440000",
    "expiresAt": "2025-12-31",
    "isActive": true,
    "plainKey": "abc123def456ghi789jkl012"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/firmware-keys/workflows/provision

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

name   string   

Name for the firmware access key. Must not be greater than 255 characters. Example: Production Farm Key

description   string  optional  

Description of the key purpose. Example: Key for firmware updates on production farm

farmUuid   string   

UUID of the farm to provision the key for. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

expiresAt   string  optional  

Expiration date for the key. Must be a valid date. Example: 2025-12-31

isActive   boolean  optional  

Whether the key is active. Example: true

plainKey   string  optional  

Pre-generated key value (optional, auto-generated if not provided). Must be at least 24 characters. Example: abc123def456ghi789jkl012

GET api/v1/c/{company_slug}/firmware-keys

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/firmware-keys

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

POST api/v1/c/{company_slug}/firmware-keys

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Production Farm Key\",
    \"description\": \"Key for firmware updates on production farm\",
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440000\",
    \"expiresAt\": \"2025-12-31\",
    \"isActive\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Production Farm Key",
    "description": "Key for firmware updates on production farm",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440000",
    "expiresAt": "2025-12-31",
    "isActive": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Production Farm Key',
            'description' => 'Key for firmware updates on production farm',
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'expiresAt' => '2025-12-31',
            'isActive' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys'
payload = {
    "name": "Production Farm Key",
    "description": "Key for firmware updates on production farm",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440000",
    "expiresAt": "2025-12-31",
    "isActive": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/firmware-keys

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

name   string   

Name for the firmware access key. Must not be greater than 255 characters. Example: Production Farm Key

description   string  optional  

Description of the key purpose. Example: Key for firmware updates on production farm

farmUuid   string   

UUID of the farm to create the key for. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

expiresAt   string  optional  

Expiration date for the key. Must be a valid date. Example: 2025-12-31

isActive   boolean  optional  

Whether the key is active. Example: true

GET api/v1/c/{company_slug}/firmware-keys/{firmwareAccessKey_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/firmware-keys/{firmwareAccessKey_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

firmwareAccessKey_uuid   string   

Example: f2c02d5b-8653-47d4-b315-5d073c2da271

PUT api/v1/c/{company_slug}/firmware-keys/{firmwareAccessKey_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Updated Farm Key\",
    \"description\": \"Updated key description\",
    \"expiresAt\": \"2026-06-30\",
    \"isActive\": false
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Updated Farm Key",
    "description": "Updated key description",
    "expiresAt": "2026-06-30",
    "isActive": false
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Updated Farm Key',
            'description' => 'Updated key description',
            'expiresAt' => '2026-06-30',
            'isActive' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271'
payload = {
    "name": "Updated Farm Key",
    "description": "Updated key description",
    "expiresAt": "2026-06-30",
    "isActive": false
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/c/{company_slug}/firmware-keys/{firmwareAccessKey_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

firmwareAccessKey_uuid   string   

Example: f2c02d5b-8653-47d4-b315-5d073c2da271

Body Parameters

name   string  optional  

Name for the firmware access key. Must not be greater than 255 characters. Example: Updated Farm Key

description   string  optional  

Description of the key purpose. Example: Updated key description

expiresAt   string  optional  

Expiration date for the key. Must be a valid date. Example: 2026-06-30

isActive   boolean  optional  

Whether the key is active. Example: false

PUT api/v1/c/{company_slug}/firmware-keys/{firmwareAccessKey_uuid}/deactivate

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271/deactivate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271/deactivate"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271/deactivate',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271/deactivate'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers)
response.json()

Request      

PUT api/v1/c/{company_slug}/firmware-keys/{firmwareAccessKey_uuid}/deactivate

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

firmwareAccessKey_uuid   string   

Example: f2c02d5b-8653-47d4-b315-5d073c2da271

List Company Invitations

requires authentication

Returns all invitations for the company.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/invitations" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/invitations"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/invitations',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/invitations'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "uuid": null,
            "email": null,
            "status": null,
            "roleSlug": null,
            "invitedBy": {
                "uuid": null,
                "name": null
            },
            "validUntil": "2026-03-26T23:05:08+00:00",
            "acceptedAt": null,
            "createdAt": "2026-03-26T23:05:08+00:00"
        },
        {
            "uuid": null,
            "email": null,
            "status": null,
            "roleSlug": null,
            "invitedBy": {
                "uuid": null,
                "name": null
            },
            "validUntil": "2026-03-26T23:05:08+00:00",
            "acceptedAt": null,
            "createdAt": "2026-03-26T23:05:08+00:00"
        }
    ]
}
 

Request      

GET api/v1/c/{company_slug}/invitations

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Create Invitation

requires authentication

Creates a new invitation and sends email to the invitee.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/invitations" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"user@example.com\",
    \"roleSlug\": \"user\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/invitations"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "user@example.com",
    "roleSlug": "user"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/invitations',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'user@example.com',
            'roleSlug' => 'user',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/invitations'
payload = {
    "email": "user@example.com",
    "roleSlug": "user"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "email": "user@example.com",
        "status": "pending",
        "roleSlug": "user",
        "validUntil": "2026-01-26T00:00:00+00:00"
    }
}
 

Request      

POST api/v1/c/{company_slug}/invitations

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

email   string   

The email address to invite. Example: user@example.com

roleSlug   string   

The role to assign on acceptance. Example: user

Revoke Invitation

requires authentication

Revokes a pending invitation.

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/invitations/4ac83d17-dbf5-30b5-af64-4f53a2991f81" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/invitations/4ac83d17-dbf5-30b5-af64-4f53a2991f81"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/invitations/4ac83d17-dbf5-30b5-af64-4f53a2991f81',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/invitations/4ac83d17-dbf5-30b5-af64-4f53a2991f81'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/invitations/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

uuid   string   

Example: 4ac83d17-dbf5-30b5-af64-4f53a2991f81

company   string   

The company slug. Example: acme-corp

invitation   string   

The invitation UUID. Example: 550e8400-e29b-41d4-a716-446655440000

Query Measurements

requires authentication

Query measurement data with support for multiple types, collectors, farms, and aggregation methods.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/measurements?types[]=officiis&from=2024-01-01T00%3A00%3A00Z&collectorUuids[]=et&farmUuid=35ee6e6b-fae8-3429-a183-f727f6583abf&farmSectionUuid=05acbf2c-8d8f-3ffb-9595-569bf5e5c8c6&collectorTypeSlug=dolorem&to=2024-01-31T23%3A59%3A59Z&raw=1&period=1-hour&aggregation=natus&valueMin=eaque&valueMax=occaecati&groupBy=error&includeMetadata=1&includeReplacements=&includeCount=1&exportType=molestiae&page=2&perPage=7&types%5B%5D[]=temperature&types%5B%5D[]=humidity&collectorUuids%5B%5D[]=at" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/measurements"
);

const params = {
    "types[0]": "officiis",
    "from": "2024-01-01T00:00:00Z",
    "collectorUuids[0]": "et",
    "farmUuid": "35ee6e6b-fae8-3429-a183-f727f6583abf",
    "farmSectionUuid": "05acbf2c-8d8f-3ffb-9595-569bf5e5c8c6",
    "collectorTypeSlug": "dolorem",
    "to": "2024-01-31T23:59:59Z",
    "raw": "1",
    "period": "1-hour",
    "aggregation": "natus",
    "valueMin": "eaque",
    "valueMax": "occaecati",
    "groupBy": "error",
    "includeMetadata": "1",
    "includeReplacements": "0",
    "includeCount": "1",
    "exportType": "molestiae",
    "page": "2",
    "perPage": "7",
    "types[][0]": "temperature",
    "types[][1]": "humidity",
    "collectorUuids[][0]": "at",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/measurements',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'types[0]' => 'officiis',
            'from' => '2024-01-01T00:00:00Z',
            'collectorUuids[0]' => 'et',
            'farmUuid' => '35ee6e6b-fae8-3429-a183-f727f6583abf',
            'farmSectionUuid' => '05acbf2c-8d8f-3ffb-9595-569bf5e5c8c6',
            'collectorTypeSlug' => 'dolorem',
            'to' => '2024-01-31T23:59:59Z',
            'raw' => '1',
            'period' => '1-hour',
            'aggregation' => 'natus',
            'valueMin' => 'eaque',
            'valueMax' => 'occaecati',
            'groupBy' => 'error',
            'includeMetadata' => '1',
            'includeReplacements' => '0',
            'includeCount' => '1',
            'exportType' => 'molestiae',
            'page' => '2',
            'perPage' => '7',
            'types[][0]' => 'temperature',
            'types[][1]' => 'humidity',
            'collectorUuids[][0]' => 'at',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/measurements'
params = {
  'types[0]': 'officiis',
  'from': '2024-01-01T00:00:00Z',
  'collectorUuids[0]': 'et',
  'farmUuid': '35ee6e6b-fae8-3429-a183-f727f6583abf',
  'farmSectionUuid': '05acbf2c-8d8f-3ffb-9595-569bf5e5c8c6',
  'collectorTypeSlug': 'dolorem',
  'to': '2024-01-31T23:59:59Z',
  'raw': '1',
  'period': '1-hour',
  'aggregation': 'natus',
  'valueMin': 'eaque',
  'valueMax': 'occaecati',
  'groupBy': 'error',
  'includeMetadata': '1',
  'includeReplacements': '0',
  'includeCount': '1',
  'exportType': 'molestiae',
  'page': '2',
  'perPage': '7',
  'types[][0]': 'temperature',
  'types[][1]': 'humidity',
  'collectorUuids[][0]': 'at',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/measurements

POST api/v1/c/{company_slug}/measurements

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

company   string   

The slug of the company Example: dolorem

Query Parameters

types   string[]  optional  

The slug of an existing record in the collector_measurement_types table.

from   string   

datetime Start date for filtering (ISO 8601). Example: 2024-01-01T00:00:00Z

collectorUuids   string[]  optional  

The uuid of an existing record in the collectors table.

farmUuid   string  optional  

Filter by farm UUID Example: 35ee6e6b-fae8-3429-a183-f727f6583abf

farmSectionUuid   string  optional  

Filter by farm section UUID Example: 05acbf2c-8d8f-3ffb-9595-569bf5e5c8c6

collectorTypeSlug   string  optional  

Filter by collector type (e.g., 'ncu', 'tcu') Example: dolorem

to   string  optional  

datetime End date for filtering (ISO 8601). Example: 2024-01-31T23:59:59Z

raw   boolean  optional  

Return raw data without aggregation. Default: false Example: true

period   string  optional  

Aggregation period slug (overrides auto-selection). Example: 1-hour

aggregation   string  optional  

Aggregation method slug from measurement_aggregation_types (see /api/v1/type/data/measurement-aggregation). Default: avg Example: natus

valueMin   string  optional  

numeric Exclude values below threshold Example: eaque

valueMax   string  optional  

numeric Exclude values above threshold Example: occaecati

groupBy   string  optional  

Grouping: measurement_type, collector, farm_section, time_bucket, tracker. Default: measurement_type Example: error

includeMetadata   boolean  optional  

Include collector info with data. Default: false Example: true

includeReplacements   boolean  optional  

Include collector replacement history on the same tracker(s) when querying by collector UUIDs. Default: false Example: false

includeCount   boolean  optional  

Include sample count per bucket. Default: false Example: true

exportType   string  optional  

Export format: json, csv, xml, excel. Default: json Example: molestiae

page   integer  optional  

Page number. Default: 1 Example: 2

perPage   integer  optional  

Items per page (max 10000). Default: 100 Example: 7

types[]   string[]   

Array of measurement type slugs.

collectorUuids[]   string[]  optional  

Filter by specific collector UUIDs

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/measurements/download-link?types[]=tenetur&from=2025-01-01T00%3A00%3A00Z&collectorUuids[]=ipsam&farmUuid=d5b1b4e7-2d71-4c16-9c0c-fc0c2b9f3d0d&farmSectionUuid=3b3fb893-1e88-4c3c-8b10-0a5c2b3cf6aa&collectorTypeSlug=ncu&to=2025-01-02T00%3A00%3A00Z&raw=&period=minute&aggregation=avg&valueMin=0&valueMax=1000&groupBy=measurement_type&includeMetadata=1&includeReplacements=&includeCount=&exportType=json&page=1&perPage=100&expiresInMinutes=10" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/measurements/download-link"
);

const params = {
    "types[0]": "tenetur",
    "from": "2025-01-01T00:00:00Z",
    "collectorUuids[0]": "ipsam",
    "farmUuid": "d5b1b4e7-2d71-4c16-9c0c-fc0c2b9f3d0d",
    "farmSectionUuid": "3b3fb893-1e88-4c3c-8b10-0a5c2b3cf6aa",
    "collectorTypeSlug": "ncu",
    "to": "2025-01-02T00:00:00Z",
    "raw": "0",
    "period": "minute",
    "aggregation": "avg",
    "valueMin": "0",
    "valueMax": "1000",
    "groupBy": "measurement_type",
    "includeMetadata": "1",
    "includeReplacements": "0",
    "includeCount": "0",
    "exportType": "json",
    "page": "1",
    "perPage": "100",
    "expiresInMinutes": "10",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/measurements/download-link',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'types[0]' => 'tenetur',
            'from' => '2025-01-01T00:00:00Z',
            'collectorUuids[0]' => 'ipsam',
            'farmUuid' => 'd5b1b4e7-2d71-4c16-9c0c-fc0c2b9f3d0d',
            'farmSectionUuid' => '3b3fb893-1e88-4c3c-8b10-0a5c2b3cf6aa',
            'collectorTypeSlug' => 'ncu',
            'to' => '2025-01-02T00:00:00Z',
            'raw' => '0',
            'period' => 'minute',
            'aggregation' => 'avg',
            'valueMin' => '0',
            'valueMax' => '1000',
            'groupBy' => 'measurement_type',
            'includeMetadata' => '1',
            'includeReplacements' => '0',
            'includeCount' => '0',
            'exportType' => 'json',
            'page' => '1',
            'perPage' => '100',
            'expiresInMinutes' => '10',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/measurements/download-link'
params = {
  'types[0]': 'tenetur',
  'from': '2025-01-01T00:00:00Z',
  'collectorUuids[0]': 'ipsam',
  'farmUuid': 'd5b1b4e7-2d71-4c16-9c0c-fc0c2b9f3d0d',
  'farmSectionUuid': '3b3fb893-1e88-4c3c-8b10-0a5c2b3cf6aa',
  'collectorTypeSlug': 'ncu',
  'to': '2025-01-02T00:00:00Z',
  'raw': '0',
  'period': 'minute',
  'aggregation': 'avg',
  'valueMin': '0',
  'valueMax': '1000',
  'groupBy': 'measurement_type',
  'includeMetadata': '1',
  'includeReplacements': '0',
  'includeCount': '0',
  'exportType': 'json',
  'page': '1',
  'perPage': '100',
  'expiresInMinutes': '10',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, params=params)
response.json()

GET api/v1/c/{company_slug}/notification-channels

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/delectus/notification-channels" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/delectus/notification-channels"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/delectus/notification-channels',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/delectus/notification-channels'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/notification-channels

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: delectus

POST api/v1/c/{company_slug}/notification-channels

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/facilis/notification-channels" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"companySlug\": \"acme-solar\",
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440111\",
    \"notificationChannelType\": \"email\",
    \"name\": \"Ops Email Alerts\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/facilis/notification-channels"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "companySlug": "acme-solar",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440111",
    "notificationChannelType": "email",
    "name": "Ops Email Alerts"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/facilis/notification-channels',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'companySlug' => 'acme-solar',
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440111',
            'notificationChannelType' => 'email',
            'name' => 'Ops Email Alerts',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/facilis/notification-channels'
payload = {
    "companySlug": "acme-solar",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440111",
    "notificationChannelType": "email",
    "name": "Ops Email Alerts"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/notification-channels

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: facilis

Body Parameters

companySlug   string   

Company slug for this channel. The slug of an existing record in the companies table. Example: acme-solar

farmUuid   string  optional  

Optional farm UUID for farm-scoped channels. Must be a valid UUID. The uuid of an existing record in the farms table. Example: 550e8400-e29b-41d4-a716-446655440111

notificationChannelType   string   

Notification channel type slug. The slug of an existing record in the notification_channel_types table. Example: email

name   string   

Display name of the notification channel. Must not be greater than 255 characters. Example: Ops Email Alerts

GET api/v1/c/{company_slug}/notification-channels/{notificationChannel_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/7d93c65a-144a-3efd-b48a-78a4e7d72450" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/7d93c65a-144a-3efd-b48a-78a4e7d72450"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/7d93c65a-144a-3efd-b48a-78a4e7d72450',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/7d93c65a-144a-3efd-b48a-78a4e7d72450'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/notification-channels/{notificationChannel_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannel_uuid   string   

Example: 7d93c65a-144a-3efd-b48a-78a4e7d72450

PUT api/v1/c/{company_slug}/notification-channels/{notificationChannel_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/a4e85879-425b-34de-a5b2-f93eb485e59d" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"notificationChannelType\": \"email\",
    \"name\": \"Operations Alerts\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/a4e85879-425b-34de-a5b2-f93eb485e59d"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "notificationChannelType": "email",
    "name": "Operations Alerts"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/a4e85879-425b-34de-a5b2-f93eb485e59d',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'notificationChannelType' => 'email',
            'name' => 'Operations Alerts',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/a4e85879-425b-34de-a5b2-f93eb485e59d'
payload = {
    "notificationChannelType": "email",
    "name": "Operations Alerts"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/c/{company_slug}/notification-channels/{notificationChannel_uuid}

PATCH api/v1/c/{company_slug}/notification-channels/{notificationChannel_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannel_uuid   string   

Example: a4e85879-425b-34de-a5b2-f93eb485e59d

Body Parameters

notificationChannelType   string  optional  

Notification channel type slug. The slug of an existing record in the notification_channel_types table. Example: email

name   string  optional  

Display name of the notification channel. Must not be greater than 255 characters. Example: Operations Alerts

DELETE api/v1/c/{company_slug}/notification-channels/{notificationChannel_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/5be1e06d-ebb0-3592-9e9e-1665c1e10c79" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/5be1e06d-ebb0-3592-9e9e-1665c1e10c79"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/5be1e06d-ebb0-3592-9e9e-1665c1e10c79',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/5be1e06d-ebb0-3592-9e9e-1665c1e10c79'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/notification-channels/{notificationChannel_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannel_uuid   string   

Example: 5be1e06d-ebb0-3592-9e9e-1665c1e10c79

POST api/v1/c/{company_slug}/notification-channels/{notificationChannel_uuid}/emails

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/8152214e-3f89-3e0a-824d-5fe7663d9afb/emails" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"emailAddress\": \"alerts@example.com\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/8152214e-3f89-3e0a-824d-5fe7663d9afb/emails"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "emailAddress": "alerts@example.com"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/8152214e-3f89-3e0a-824d-5fe7663d9afb/emails',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'emailAddress' => 'alerts@example.com',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/8152214e-3f89-3e0a-824d-5fe7663d9afb/emails'
payload = {
    "emailAddress": "alerts@example.com"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/notification-channels/{notificationChannel_uuid}/emails

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannel_uuid   string   

Example: 8152214e-3f89-3e0a-824d-5fe7663d9afb

Body Parameters

emailAddress   string   

Email address to receive notifications. Must be a valid email address. Must not be greater than 255 characters. Example: alerts@example.com

POST api/v1/c/{company_slug}/notification-channels/{notificationChannel_uuid}/push-devices

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/efaa4a0d-de47-3124-bf91-71c1c4629636/push-devices" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"mobileDeviceUuid\": \"550e8400-e29b-41d4-a716-446655440000\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/efaa4a0d-de47-3124-bf91-71c1c4629636/push-devices"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "mobileDeviceUuid": "550e8400-e29b-41d4-a716-446655440000"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/efaa4a0d-de47-3124-bf91-71c1c4629636/push-devices',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'mobileDeviceUuid' => '550e8400-e29b-41d4-a716-446655440000',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/efaa4a0d-de47-3124-bf91-71c1c4629636/push-devices'
payload = {
    "mobileDeviceUuid": "550e8400-e29b-41d4-a716-446655440000"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/notification-channels/{notificationChannel_uuid}/push-devices

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannel_uuid   string   

Example: efaa4a0d-de47-3124-bf91-71c1c4629636

Body Parameters

mobileDeviceUuid   string   

UUID of the mobile device to link for push notifications. Must be a valid UUID. The uuid of an existing record in the mobile_devices table. Example: 550e8400-e29b-41d4-a716-446655440000

POST api/v1/c/{company_slug}/notification-channels/{notificationChannel_uuid}/webhooks

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/93d73d1e-d06c-3dde-83bf-ff208ffd9e4c/webhooks" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"PagerDuty Webhook\",
    \"url\": \"https:\\/\\/hooks.example.com\\/alerts\",
    \"httpMethod\": \"POST\",
    \"timeoutSeconds\": 30
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/93d73d1e-d06c-3dde-83bf-ff208ffd9e4c/webhooks"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "PagerDuty Webhook",
    "url": "https:\/\/hooks.example.com\/alerts",
    "httpMethod": "POST",
    "timeoutSeconds": 30
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/93d73d1e-d06c-3dde-83bf-ff208ffd9e4c/webhooks',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'PagerDuty Webhook',
            'url' => 'https://hooks.example.com/alerts',
            'httpMethod' => 'POST',
            'timeoutSeconds' => 30,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-channels/93d73d1e-d06c-3dde-83bf-ff208ffd9e4c/webhooks'
payload = {
    "name": "PagerDuty Webhook",
    "url": "https:\/\/hooks.example.com\/alerts",
    "httpMethod": "POST",
    "timeoutSeconds": 30
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/notification-channels/{notificationChannel_uuid}/webhooks

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannel_uuid   string   

Example: 93d73d1e-d06c-3dde-83bf-ff208ffd9e4c

Body Parameters

name   string   

Webhook name. Must not be greater than 255 characters. Example: PagerDuty Webhook

url   string   

Webhook URL endpoint. Must be a valid URL. Must not be greater than 2048 characters. Example: https://hooks.example.com/alerts

httpMethod   string  optional  

HTTP method used for webhook delivery. Example: POST

timeoutSeconds   integer  optional  

Webhook timeout in seconds. Must be at least 1. Must not be greater than 120. Example: 30

DELETE api/v1/c/{company_slug}/notification-channel-emails/{notificationChannelEmail_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-emails/4fa4e220-5e7f-387e-a7e5-685efe3f5158" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-emails/4fa4e220-5e7f-387e-a7e5-685efe3f5158"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-emails/4fa4e220-5e7f-387e-a7e5-685efe3f5158',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-emails/4fa4e220-5e7f-387e-a7e5-685efe3f5158'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/notification-channel-emails/{notificationChannelEmail_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannelEmail_uuid   string   

Example: 4fa4e220-5e7f-387e-a7e5-685efe3f5158

DELETE api/v1/c/{company_slug}/notification-channel-push-devices/{notificationChannelPushDevice_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-push-devices/14174b37-e53f-30d7-9da6-572aefc6f13c" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-push-devices/14174b37-e53f-30d7-9da6-572aefc6f13c"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-push-devices/14174b37-e53f-30d7-9da6-572aefc6f13c',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-push-devices/14174b37-e53f-30d7-9da6-572aefc6f13c'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/notification-channel-push-devices/{notificationChannelPushDevice_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannelPushDevice_uuid   string   

Example: 14174b37-e53f-30d7-9da6-572aefc6f13c

PUT api/v1/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhooks/f166f8f9-765c-3e10-b7a2-67a54344648e" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"PagerDuty Webhook\",
    \"url\": \"https:\\/\\/hooks.example.com\\/alerts\",
    \"httpMethod\": \"PATCH\",
    \"timeoutSeconds\": 20
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhooks/f166f8f9-765c-3e10-b7a2-67a54344648e"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "PagerDuty Webhook",
    "url": "https:\/\/hooks.example.com\/alerts",
    "httpMethod": "PATCH",
    "timeoutSeconds": 20
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhooks/f166f8f9-765c-3e10-b7a2-67a54344648e',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'PagerDuty Webhook',
            'url' => 'https://hooks.example.com/alerts',
            'httpMethod' => 'PATCH',
            'timeoutSeconds' => 20,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhooks/f166f8f9-765c-3e10-b7a2-67a54344648e'
payload = {
    "name": "PagerDuty Webhook",
    "url": "https:\/\/hooks.example.com\/alerts",
    "httpMethod": "PATCH",
    "timeoutSeconds": 20
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}

PATCH api/v1/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannelWebhook_uuid   string   

Example: f166f8f9-765c-3e10-b7a2-67a54344648e

Body Parameters

name   string  optional  

Webhook name. Must not be greater than 255 characters. Example: PagerDuty Webhook

url   string  optional  

Webhook URL endpoint. Must be a valid URL. Must not be greater than 2048 characters. Example: https://hooks.example.com/alerts

httpMethod   string  optional  

HTTP method used for webhook delivery. Example: PATCH

timeoutSeconds   integer  optional  

Webhook timeout in seconds. Must be at least 1. Must not be greater than 120. Example: 20

DELETE api/v1/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhooks/5b2174c8-eb77-3b20-9fb9-9bd62470b047" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhooks/5b2174c8-eb77-3b20-9fb9-9bd62470b047"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhooks/5b2174c8-eb77-3b20-9fb9-9bd62470b047',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhooks/5b2174c8-eb77-3b20-9fb9-9bd62470b047'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannelWebhook_uuid   string   

Example: 5b2174c8-eb77-3b20-9fb9-9bd62470b047

POST api/v1/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}/headers

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhooks/95324a82-1f6e-367d-b883-2b3737ad37c4/headers" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"headerKey\": \"X-Signature\",
    \"headerValue\": \"secret-token\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhooks/95324a82-1f6e-367d-b883-2b3737ad37c4/headers"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "headerKey": "X-Signature",
    "headerValue": "secret-token"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhooks/95324a82-1f6e-367d-b883-2b3737ad37c4/headers',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'headerKey' => 'X-Signature',
            'headerValue' => 'secret-token',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhooks/95324a82-1f6e-367d-b883-2b3737ad37c4/headers'
payload = {
    "headerKey": "X-Signature",
    "headerValue": "secret-token"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}/headers

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannelWebhook_uuid   string   

Example: 95324a82-1f6e-367d-b883-2b3737ad37c4

Body Parameters

headerKey   string   

Webhook header key. Must not be greater than 255 characters. Example: X-Signature

headerValue   string   

Webhook header value. Must not be greater than 1000 characters. Example: secret-token

DELETE api/v1/c/{company_slug}/notification-channel-webhook-headers/{notificationChannelWebhookHeader_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhook-headers/3dc980bf-064e-34e5-a955-5d980b1af527" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhook-headers/3dc980bf-064e-34e5-a955-5d980b1af527"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhook-headers/3dc980bf-064e-34e5-a955-5d980b1af527',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-channel-webhook-headers/3dc980bf-064e-34e5-a955-5d980b1af527'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/notification-channel-webhook-headers/{notificationChannelWebhookHeader_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannelWebhookHeader_uuid   string   

Example: 3dc980bf-064e-34e5-a955-5d980b1af527

GET api/v1/c/{company_slug}/notification-templates

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/sint/notification-templates" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/sint/notification-templates"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/sint/notification-templates',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/sint/notification-templates'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/notification-templates

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: sint

POST api/v1/c/{company_slug}/notification-templates

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/nihil/notification-templates" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"notificationChannelType\": \"email\",
    \"notificationTemplateFormatType\": \"text\",
    \"name\": \"Critical Alert Template\",
    \"subjectTemplate\": \"[Alert] Collector Offline\",
    \"bodyTemplate\": \"Alert: Collector went offline at Farm Alpha.\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/nihil/notification-templates"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "notificationChannelType": "email",
    "notificationTemplateFormatType": "text",
    "name": "Critical Alert Template",
    "subjectTemplate": "[Alert] Collector Offline",
    "bodyTemplate": "Alert: Collector went offline at Farm Alpha."
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/nihil/notification-templates',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'notificationChannelType' => 'email',
            'notificationTemplateFormatType' => 'text',
            'name' => 'Critical Alert Template',
            'subjectTemplate' => '[Alert] Collector Offline',
            'bodyTemplate' => 'Alert: Collector went offline at Farm Alpha.',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/nihil/notification-templates'
payload = {
    "notificationChannelType": "email",
    "notificationTemplateFormatType": "text",
    "name": "Critical Alert Template",
    "subjectTemplate": "[Alert] Collector Offline",
    "bodyTemplate": "Alert: Collector went offline at Farm Alpha."
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/notification-templates

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: nihil

Body Parameters

notificationChannelType   string   

Notification channel type slug. The slug of an existing record in the notification_channel_types table. Example: email

notificationTemplateFormatType   string   

Notification template format type slug. The slug of an existing record in the notification_template_format_types table. Example: text

name   string   

Template name. Must not be greater than 255 characters. Example: Critical Alert Template

subjectTemplate   string  optional  

Optional subject template. Supports double-curly-brace placeholders: ruleName, collectorName, triggeredValue, conditionOperator, conditionThreshold, triggeredAt, companyName, farmName. Must not be greater than 500 characters. Example: [Alert] Collector Offline

bodyTemplate   string   

Template body content. Supports double-curly-brace placeholders: ruleName, collectorName, triggeredValue, conditionOperator, conditionThreshold, triggeredAt, companyName, farmName. Example: Alert: Collector went offline at Farm Alpha.

GET api/v1/c/{company_slug}/notification-templates/{notificationTemplate_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/notification-templates/{notificationTemplate_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationTemplate_uuid   string   

Example: d4d5b924-eff1-44a7-bcc9-b271d8207888

PUT api/v1/c/{company_slug}/notification-templates/{notificationTemplate_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"notificationChannelType\": \"email\",
    \"notificationTemplateFormatType\": \"html\",
    \"name\": \"Updated Alert Template\",
    \"subjectTemplate\": \"[Updated] Collector Offline\",
    \"bodyTemplate\": \"<p>Alert rule updated for Collector Alpha.<\\/p>\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "notificationChannelType": "email",
    "notificationTemplateFormatType": "html",
    "name": "Updated Alert Template",
    "subjectTemplate": "[Updated] Collector Offline",
    "bodyTemplate": "<p>Alert rule updated for Collector Alpha.<\/p>"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'notificationChannelType' => 'email',
            'notificationTemplateFormatType' => 'html',
            'name' => 'Updated Alert Template',
            'subjectTemplate' => '[Updated] Collector Offline',
            'bodyTemplate' => '<p>Alert rule updated for Collector Alpha.</p>',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888'
payload = {
    "notificationChannelType": "email",
    "notificationTemplateFormatType": "html",
    "name": "Updated Alert Template",
    "subjectTemplate": "[Updated] Collector Offline",
    "bodyTemplate": "<p>Alert rule updated for Collector Alpha.<\/p>"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/c/{company_slug}/notification-templates/{notificationTemplate_uuid}

PATCH api/v1/c/{company_slug}/notification-templates/{notificationTemplate_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationTemplate_uuid   string   

Example: d4d5b924-eff1-44a7-bcc9-b271d8207888

Body Parameters

notificationChannelType   string  optional  

Notification channel type slug. The slug of an existing record in the notification_channel_types table. Example: email

notificationTemplateFormatType   string  optional  

Notification template format type slug. The slug of an existing record in the notification_template_format_types table. Example: html

name   string  optional  

Template name. Must not be greater than 255 characters. Example: Updated Alert Template

subjectTemplate   string  optional  

Optional subject template. Supports double-curly-brace placeholders: ruleName, collectorName, triggeredValue, conditionOperator, conditionThreshold, triggeredAt, companyName, farmName. Must not be greater than 500 characters. Example: [Updated] Collector Offline

bodyTemplate   string  optional  

Template body content. Supports double-curly-brace placeholders: ruleName, collectorName, triggeredValue, conditionOperator, conditionThreshold, triggeredAt, companyName, farmName. Example: <p>Alert rule updated for Collector Alpha.</p>

DELETE api/v1/c/{company_slug}/notification-templates/{notificationTemplate_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/notification-templates/{notificationTemplate_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationTemplate_uuid   string   

Example: d4d5b924-eff1-44a7-bcc9-b271d8207888

GET api/v1/c/{company_slug}/notification-policies

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/aut/notification-policies" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/aut/notification-policies"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/aut/notification-policies',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/aut/notification-policies'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/notification-policies

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: aut

POST api/v1/c/{company_slug}/notification-policies

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/velit/notification-policies" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"companySlug\": \"acme-solar\",
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440121\",
    \"collectorUuid\": \"550e8400-e29b-41d4-a716-446655440122\",
    \"name\": \"Critical Weather Policy\",
    \"enabled\": true,
    \"notificationChannelUuid\": \"550e8400-e29b-41d4-a716-446655440123\",
    \"notificationTemplateUuid\": \"550e8400-e29b-41d4-a716-446655440124\",
    \"labels\": [
        {
            \"key\": \"severity\",
            \"value\": \"critical\"
        }
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/velit/notification-policies"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "companySlug": "acme-solar",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440121",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440122",
    "name": "Critical Weather Policy",
    "enabled": true,
    "notificationChannelUuid": "550e8400-e29b-41d4-a716-446655440123",
    "notificationTemplateUuid": "550e8400-e29b-41d4-a716-446655440124",
    "labels": [
        {
            "key": "severity",
            "value": "critical"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/velit/notification-policies',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'companySlug' => 'acme-solar',
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440121',
            'collectorUuid' => '550e8400-e29b-41d4-a716-446655440122',
            'name' => 'Critical Weather Policy',
            'enabled' => true,
            'notificationChannelUuid' => '550e8400-e29b-41d4-a716-446655440123',
            'notificationTemplateUuid' => '550e8400-e29b-41d4-a716-446655440124',
            'labels' => [
                [
                    'key' => 'severity',
                    'value' => 'critical',
                ],
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/velit/notification-policies'
payload = {
    "companySlug": "acme-solar",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440121",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440122",
    "name": "Critical Weather Policy",
    "enabled": true,
    "notificationChannelUuid": "550e8400-e29b-41d4-a716-446655440123",
    "notificationTemplateUuid": "550e8400-e29b-41d4-a716-446655440124",
    "labels": [
        {
            "key": "severity",
            "value": "critical"
        }
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/notification-policies

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: velit

Body Parameters

companySlug   string  optional  

Company scope slug. Provide exactly one scope field. The slug of an existing record in the companies table. Example: acme-solar

farmUuid   string  optional  

Farm scope UUID. Provide exactly one scope field. Must be a valid UUID. The uuid of an existing record in the farms table. Example: 550e8400-e29b-41d4-a716-446655440121

collectorUuid   string  optional  

Collector scope UUID. Provide exactly one scope field. Must be a valid UUID. The uuid of an existing record in the collectors table. Example: 550e8400-e29b-41d4-a716-446655440122

name   string   

Notification policy name. Must not be greater than 255 characters. Example: Critical Weather Policy

enabled   boolean  optional  

Whether the policy is enabled. Example: true

notificationChannelUuid   string   

Notification channel UUID. Must be a valid UUID. The uuid of an existing record in the notification_channels table. Example: 550e8400-e29b-41d4-a716-446655440123

notificationTemplateUuid   string   

Notification template UUID. Must be a valid UUID. The uuid of an existing record in the notification_templates table. Example: 550e8400-e29b-41d4-a716-446655440124

labels   object[]  optional  

Optional key/value label filters.

key   string  optional  

This field is required when labels is present. Must not be greater than 255 characters. Example: j

value   string  optional  

This field is required when labels is present. Must not be greater than 255 characters. Example: rfeuoqqtixseh

GET api/v1/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/notification-policies/22604c3e-be5f-326a-b804-4e8b052d1e5e" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-policies/22604c3e-be5f-326a-b804-4e8b052d1e5e"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-policies/22604c3e-be5f-326a-b804-4e8b052d1e5e',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-policies/22604c3e-be5f-326a-b804-4e8b052d1e5e'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationPolicy_uuid   string   

Example: 22604c3e-be5f-326a-b804-4e8b052d1e5e

PUT api/v1/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-policies/6d1201ae-383e-3d19-a2d5-248898cb6568" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Critical Weather Policy\",
    \"enabled\": false,
    \"notificationChannelUuid\": \"550e8400-e29b-41d4-a716-446655440223\",
    \"notificationTemplateUuid\": \"550e8400-e29b-41d4-a716-446655440224\",
    \"labels\": [
        {
            \"key\": \"site\",
            \"value\": \"north-farm\"
        }
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-policies/6d1201ae-383e-3d19-a2d5-248898cb6568"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Critical Weather Policy",
    "enabled": false,
    "notificationChannelUuid": "550e8400-e29b-41d4-a716-446655440223",
    "notificationTemplateUuid": "550e8400-e29b-41d4-a716-446655440224",
    "labels": [
        {
            "key": "site",
            "value": "north-farm"
        }
    ]
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-policies/6d1201ae-383e-3d19-a2d5-248898cb6568',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Critical Weather Policy',
            'enabled' => false,
            'notificationChannelUuid' => '550e8400-e29b-41d4-a716-446655440223',
            'notificationTemplateUuid' => '550e8400-e29b-41d4-a716-446655440224',
            'labels' => [
                [
                    'key' => 'site',
                    'value' => 'north-farm',
                ],
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-policies/6d1201ae-383e-3d19-a2d5-248898cb6568'
payload = {
    "name": "Critical Weather Policy",
    "enabled": false,
    "notificationChannelUuid": "550e8400-e29b-41d4-a716-446655440223",
    "notificationTemplateUuid": "550e8400-e29b-41d4-a716-446655440224",
    "labels": [
        {
            "key": "site",
            "value": "north-farm"
        }
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

PATCH api/v1/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationPolicy_uuid   string   

Example: 6d1201ae-383e-3d19-a2d5-248898cb6568

Body Parameters

name   string  optional  

Notification policy name. Must not be greater than 255 characters. Example: Critical Weather Policy

enabled   boolean  optional  

Whether the policy is enabled. Example: false

notificationChannelUuid   string  optional  

Notification channel UUID. Must be a valid UUID. The uuid of an existing record in the notification_channels table. Example: 550e8400-e29b-41d4-a716-446655440223

notificationTemplateUuid   string  optional  

Notification template UUID. Must be a valid UUID. The uuid of an existing record in the notification_templates table. Example: 550e8400-e29b-41d4-a716-446655440224

labels   object[]  optional  

Optional key/value label filters.

key   string  optional  

This field is required when labels is present. Must not be greater than 255 characters. Example: zdbldm

value   string  optional  

This field is required when labels is present. Must not be greater than 255 characters. Example: cboxfsxrvodkshh

DELETE api/v1/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-policies/765fa1ab-9e1a-3c3c-8312-4c797fe4e090" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/notification-policies/765fa1ab-9e1a-3c3c-8312-4c797fe4e090"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/notification-policies/765fa1ab-9e1a-3c3c-8312-4c797fe4e090',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/notification-policies/765fa1ab-9e1a-3c3c-8312-4c797fe4e090'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationPolicy_uuid   string   

Example: 765fa1ab-9e1a-3c3c-8312-4c797fe4e090

List RMA requests for the company.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/rma?status=requested&collectorUuid=550e8400-e29b-41d4-a716-446655440000&dateFrom=2025-01-01&dateTo=2025-12-31&page=1&perPage=25" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/rma"
);

const params = {
    "status": "requested",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440000",
    "dateFrom": "2025-01-01",
    "dateTo": "2025-12-31",
    "page": "1",
    "perPage": "25",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/rma',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'status' => 'requested',
            'collectorUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'dateFrom' => '2025-01-01',
            'dateTo' => '2025-12-31',
            'page' => '1',
            'perPage' => '25',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/rma'
params = {
  'status': 'requested',
  'collectorUuid': '550e8400-e29b-41d4-a716-446655440000',
  'dateFrom': '2025-01-01',
  'dateTo': '2025-12-31',
  'page': '1',
  'perPage': '25',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/rma

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

company   string   

The slug of the company Example: at

Query Parameters

status   string  optional  

Filter by RMA status slug. Example: requested

collectorUuid   string  optional  

Filter by collector UUID. Example: 550e8400-e29b-41d4-a716-446655440000

dateFrom   string  optional  

Filter RMA requests created from this date (ISO 8601). Example: 2025-01-01

dateTo   string  optional  

Filter RMA requests created up to this date (ISO 8601). Example: 2025-12-31

page   integer  optional  

Page number for pagination. Example: 1

perPage   integer  optional  

Number of items per page. Example: 25

Create a new RMA request.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/rma" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"collectorUuid\": \"550e8400-e29b-41d4-a716-446655440000\",
    \"reason\": \"Hardware fault detected\",
    \"description\": \"Collector stopped responding after firmware update\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/rma"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440000",
    "reason": "Hardware fault detected",
    "description": "Collector stopped responding after firmware update"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/rma',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'collectorUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'reason' => 'Hardware fault detected',
            'description' => 'Collector stopped responding after firmware update',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/rma'
payload = {
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440000",
    "reason": "Hardware fault detected",
    "description": "Collector stopped responding after firmware update"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/rma

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

company   string   

The slug of the company Example: praesentium

Body Parameters

collectorUuid   string   

The UUID of the collector. Example: 550e8400-e29b-41d4-a716-446655440000

reason   string   

The reason for the RMA request. Example: Hardware fault detected

description   string  optional  

optional Additional details. Example: Collector stopped responding after firmware update

Show RMA request details.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/rma/1303375b-5838-3d02-9160-09b2dbe9f4df" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/rma/1303375b-5838-3d02-9160-09b2dbe9f4df"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/rma/1303375b-5838-3d02-9160-09b2dbe9f4df',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/rma/1303375b-5838-3d02-9160-09b2dbe9f4df'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/rma/{rmaRequest_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

rmaRequest_uuid   string   

Example: 1303375b-5838-3d02-9160-09b2dbe9f4df

company   string   

The slug of the company Example: voluptas

rmaRequest   string   

The UUID of the RMA request Example: neque

Update RMA status (e.g. shipped-to-vendor with tracking number).

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/c/tracklab/rma/b14ee05a-2377-3ab4-8eb0-9f5f3b44b9f2" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"trackingNumber\": \"1Z999AA10123456784\",
    \"status\": \"shipped-to-vendor\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/rma/b14ee05a-2377-3ab4-8eb0-9f5f3b44b9f2"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "trackingNumber": "1Z999AA10123456784",
    "status": "shipped-to-vendor"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/c/tracklab/rma/b14ee05a-2377-3ab4-8eb0-9f5f3b44b9f2',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'trackingNumber' => '1Z999AA10123456784',
            'status' => 'shipped-to-vendor',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/rma/b14ee05a-2377-3ab4-8eb0-9f5f3b44b9f2'
payload = {
    "trackingNumber": "1Z999AA10123456784",
    "status": "shipped-to-vendor"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/c/{company_slug}/rma/{rmaRequest_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

rmaRequest_uuid   string   

Example: b14ee05a-2377-3ab4-8eb0-9f5f3b44b9f2

company   string   

The slug of the company Example: sint

rmaRequest   string   

The UUID of the RMA request Example: nihil

Body Parameters

trackingNumber   string  optional  

optional Tracking number for shipment. Example: 1Z999AA10123456784

status   string   

The target status slug. Example: shipped-to-vendor

Approve an RMA request.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/rma/f98aac80-670c-3833-ae42-96cf36b40a33/approve" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/rma/f98aac80-670c-3833-ae42-96cf36b40a33/approve"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/rma/f98aac80-670c-3833-ae42-96cf36b40a33/approve',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/rma/f98aac80-670c-3833-ae42-96cf36b40a33/approve'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/c/{company_slug}/rma/{rmaRequest_uuid}/approve

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

rmaRequest_uuid   string   

Example: f98aac80-670c-3833-ae42-96cf36b40a33

company   string   

The slug of the company Example: nobis

rmaRequest   string   

The UUID of the RMA request Example: aut

Reject an RMA request.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/rma/45b7c84b-25f9-3a7a-a690-66c3b5ae1207/reject" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"reason\": \"Collector is under warranty with manufacturer\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/rma/45b7c84b-25f9-3a7a-a690-66c3b5ae1207/reject"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "reason": "Collector is under warranty with manufacturer"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/rma/45b7c84b-25f9-3a7a-a690-66c3b5ae1207/reject',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'reason' => 'Collector is under warranty with manufacturer',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/rma/45b7c84b-25f9-3a7a-a690-66c3b5ae1207/reject'
payload = {
    "reason": "Collector is under warranty with manufacturer"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/rma/{rmaRequest_uuid}/reject

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

rmaRequest_uuid   string   

Example: 45b7c84b-25f9-3a7a-a690-66c3b5ae1207

company   string   

The slug of the company Example: qui

rmaRequest   string   

The UUID of the RMA request Example: sapiente

Body Parameters

reason   string   

The reason for rejection. Example: Collector is under warranty with manufacturer

List notes for an RMA request.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/rma/89ca5ef1-8f1f-3c9b-a593-7dde5de884c3/notes" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/rma/89ca5ef1-8f1f-3c9b-a593-7dde5de884c3/notes"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/rma/89ca5ef1-8f1f-3c9b-a593-7dde5de884c3/notes',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/rma/89ca5ef1-8f1f-3c9b-a593-7dde5de884c3/notes'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/rma/{rmaRequest_uuid}/notes

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

rmaRequest_uuid   string   

Example: 89ca5ef1-8f1f-3c9b-a593-7dde5de884c3

company   string   

The slug of the company Example: nulla

rmaRequest   string   

The UUID of the RMA request Example: labore

Add a note to an RMA request.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/rma/a03862fc-1255-3f84-bb8e-c325bb9974c8/notes" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"note\": \"Customer contacted regarding shipping label\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/rma/a03862fc-1255-3f84-bb8e-c325bb9974c8/notes"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "note": "Customer contacted regarding shipping label"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/rma/a03862fc-1255-3f84-bb8e-c325bb9974c8/notes',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'note' => 'Customer contacted regarding shipping label',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/rma/a03862fc-1255-3f84-bb8e-c325bb9974c8/notes'
payload = {
    "note": "Customer contacted regarding shipping label"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/rma/{rmaRequest_uuid}/notes

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

rmaRequest_uuid   string   

Example: a03862fc-1255-3f84-bb8e-c325bb9974c8

company   string   

The slug of the company Example: ratione

rmaRequest   string   

The UUID of the RMA request Example: quia

Body Parameters

note   string   

The note content. Example: Customer contacted regarding shipping label

Show a farm section

requires authentication

Returns details of a specific farm section. Requires FARM_VIEW permission.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "uuid": "147594ba-6f75-4b06-9daf-4c9dc58b34c1",
        "name": "Unassigned",
        "description": "",
        "enabled": true,
        "orderColumn": 0,
        "location": null,
        "locationJson": null,
        "metadata": null,
        "createdAt": "2026-01-14T19:48:46+00:00",
        "updatedAt": "2026-01-16T10:41:36+00:00",
        "isUnassigned": true
    }
}
 

Request      

GET api/v1/c/{company_slug}/section/{section_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

section_uuid   string   

Example: 147594ba-6f75-4b06-9daf-4c9dc58b34c1

company   string   

The slug of the company. Example: tracklab

section   string   

The UUID of the farm section. Example: 550e8400-e29b-41d4-a716-446655440123

Update a farm section

requires authentication

Updates an existing farm section. Requires FARM_UPDATE permission. The "Unassigned" section cannot be edited.

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"North Field Updated\",
    \"description\": \"Updated description\",
    \"enabled\": false,
    \"orderColumn\": 2,
    \"locationJson\": {
        \"latitude\": 51.509865,
        \"longitude\": -0.118092
    },
    \"metadata\": {
        \"notes\": \"Updated notes\"
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "North Field Updated",
    "description": "Updated description",
    "enabled": false,
    "orderColumn": 2,
    "locationJson": {
        "latitude": 51.509865,
        "longitude": -0.118092
    },
    "metadata": {
        "notes": "Updated notes"
    }
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'North Field Updated',
            'description' => 'Updated description',
            'enabled' => false,
            'orderColumn' => 2,
            'locationJson' => [
                'latitude' => 51.509865,
                'longitude' => -0.118092,
            ],
            'metadata' => [
                'notes' => 'Updated notes',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1'
payload = {
    "name": "North Field Updated",
    "description": "Updated description",
    "enabled": false,
    "orderColumn": 2,
    "locationJson": {
        "latitude": 51.509865,
        "longitude": -0.118092
    },
    "metadata": {
        "notes": "Updated notes"
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "147594ba-6f75-4b06-9daf-4c9dc58b34c1",
        "name": "Unassigned",
        "description": "",
        "enabled": true,
        "orderColumn": 0,
        "location": null,
        "locationJson": null,
        "metadata": null,
        "createdAt": "2026-01-14T19:48:46+00:00",
        "updatedAt": "2026-01-16T10:41:36+00:00",
        "isUnassigned": true
    }
}
 

Request      

PATCH api/v1/c/{company_slug}/section/{section_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

section_uuid   string   

Example: 147594ba-6f75-4b06-9daf-4c9dc58b34c1

company   string   

The slug of the company. Example: tracklab

section   string   

The UUID of the farm section. Example: 550e8400-e29b-41d4-a716-446655440123

Body Parameters

name   string  optional  

The name of the section. Example: North Field Updated

slug   string  optional  
description   string  optional  

The description. Example: Updated description

enabled   boolean  optional  

Whether section is enabled. Example: false

orderColumn   integer  optional  

Display order. Example: 2

locationJson   object  optional  

Location coordinates.

latitude   number  optional  

This field is required when locationJson is present. Must be between -90 and 90. Example: 51.509865

longitude   number  optional  

This field is required when locationJson is present. Must be between -180 and 180. Example: -0.118092

metadata   object  optional  

Optional metadata.

Delete a farm section

requires authentication

Deletes a farm section. Requires FARM_UPDATE permission. The "Unassigned" section cannot be deleted.

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204):

[Empty response]
 

Request      

DELETE api/v1/c/{company_slug}/section/{section_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

section_uuid   string   

Example: 147594ba-6f75-4b06-9daf-4c9dc58b34c1

company   string   

The slug of the company. Example: tracklab

section   string   

The UUID of the farm section. Example: 550e8400-e29b-41d4-a716-446655440123

Bulk assign collectors to section

requires authentication

Assigns multiple collectors to a specific farm section. The farm is derived from the section automatically. Collectors already on this farm+section are skipped. Requires COLLECTOR_UPDATE permission.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1/collectors/bulk-assign" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"collectorUuids\": [
        \"550e8400-e29b-41d4-a716-446655440001\",
        \"550e8400-e29b-41d4-a716-446655440002\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1/collectors/bulk-assign"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "collectorUuids": [
        "550e8400-e29b-41d4-a716-446655440001",
        "550e8400-e29b-41d4-a716-446655440002"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1/collectors/bulk-assign',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'collectorUuids' => [
                '550e8400-e29b-41d4-a716-446655440001',
                '550e8400-e29b-41d4-a716-446655440002',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/section/147594ba-6f75-4b06-9daf-4c9dc58b34c1/collectors/bulk-assign'
payload = {
    "collectorUuids": [
        "550e8400-e29b-41d4-a716-446655440001",
        "550e8400-e29b-41d4-a716-446655440002"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{"data": {"assigned": 2, "skipped": 1, "collectors": [...]}}
 

Example response (403):


{
    "message": "This action is unauthorized."
}
 

Example response (404):


{
    "error": "Section not found"
}
 

Example response (422):


{
    "message": "Validation failed",
    "errors": {
        "collectorUuids": [
            "At least one collector UUID is required"
        ]
    }
}
 

Request      

POST api/v1/c/{company_slug}/section/{section_uuid}/collectors/bulk-assign

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

section_uuid   string   

Example: 147594ba-6f75-4b06-9daf-4c9dc58b34c1

company   string   

The slug of the company. Example: tracklab

section   string   

The UUID of the farm section. Example: 550e8400-e29b-41d4-a716-446655440123

Body Parameters

collectorUuids   string[]   

List of collector UUIDs to assign.

Get current weather for all farms in a company

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/weather" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/weather"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/weather',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/weather'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/weather

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Get current weather for a specific farm

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/weather/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/current" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/weather/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/current"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/weather/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/current',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/weather/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/current'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/weather/farm/{farm_uuid}/current

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

Get weather history for a specific farm

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/weather/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/history" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"from\": \"2025-01-01\",
    \"to\": \"2025-01-31\",
    \"page\": 1,
    \"perPage\": 25,
    \"limit\": 6
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/weather/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/history"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "from": "2025-01-01",
    "to": "2025-01-31",
    "page": 1,
    "perPage": 25,
    "limit": 6
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/weather/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/history',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'from' => '2025-01-01',
            'to' => '2025-01-31',
            'page' => 1,
            'perPage' => 25,
            'limit' => 6,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/weather/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/history'
payload = {
    "from": "2025-01-01",
    "to": "2025-01-31",
    "page": 1,
    "perPage": 25,
    "limit": 6
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/weather/farm/{farm_uuid}/history

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

Body Parameters

from   string  optional  

Start date for weather history. Must be a valid date. Must be a date before or equal to to. Example: 2025-01-01

to   string  optional  

End date for weather history. Must be a valid date. Must be a date after or equal to from. Example: 2025-01-31

page   integer  optional  

Page number for pagination. Must be at least 1. Example: 1

perPage   integer  optional  

Number of records per page (max 100). Must be at least 1. Must not be greater than 100. Example: 25

limit   integer  optional  

Must be at least 1. Must not be greater than 100. Example: 6

Refresh weather data for a specific farm

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/weather/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/refresh" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/weather/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/refresh"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/weather/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/refresh',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/weather/farm/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/refresh'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/c/{company_slug}/weather/farm/{farm_uuid}/refresh

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

GET api/v1/c/{company_slug}/device-model-insights/{collector_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/device-model-insights/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/device-model-insights/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/device-model-insights/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/device-model-insights/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/device-model-insights/{collector_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

GET api/v1/c/{company_slug}/firmware

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/c/tracklab/firmware" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"deviceModelTypeSlug\": \"ncu-v2\",
    \"enabled\": true,
    \"perPage\": 25
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/firmware"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "deviceModelTypeSlug": "ncu-v2",
    "enabled": true,
    "perPage": 25
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/c/tracklab/firmware',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'deviceModelTypeSlug' => 'ncu-v2',
            'enabled' => true,
            'perPage' => 25,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/firmware'
payload = {
    "deviceModelTypeSlug": "ncu-v2",
    "enabled": true,
    "perPage": 25
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/c/{company_slug}/firmware

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

deviceModelTypeSlug   string  optional  

Filter by device model type slug. The slug of an existing record in the device_model_types table. Example: ncu-v2

enabled   boolean  optional  

Filter by enabled status. Example: true

perPage   integer  optional  

Number of records per page (1-100). Must be at least 1. Must not be greater than 100. Example: 25

Store Mobile Audit Events

requires authentication

Upload a batch of mobile audit events for a company. Duplicate eventUuids are silently skipped (idempotent).

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/mobile/audit-events" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"deviceUuid\": \"550e8400-e29b-41d4-a716-446655440070\",
    \"events\": [
        {
            \"eventUuid\": \"550e8400-e29b-41d4-a716-446655440071\",
            \"occurredAt\": \"2026-02-17T10:00:00Z\",
            \"eventName\": \"collector_connection\",
            \"actionName\": \"connect\",
            \"operatorLabel\": \"operator-1\",
            \"connectionType\": \"bluetooth\",
            \"collectorUuid\": \"550e8400-e29b-41d4-a716-446655440072\",
            \"context\": {
                \"signalRssi\": -64
            },
            \"request\": {
                \"source\": \"mobile\"
            },
            \"result\": {
                \"status\": \"success\"
            },
            \"geo\": {
                \"lat\": 33.4484,
                \"lng\": -112.074
            }
        }
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/mobile/audit-events"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "deviceUuid": "550e8400-e29b-41d4-a716-446655440070",
    "events": [
        {
            "eventUuid": "550e8400-e29b-41d4-a716-446655440071",
            "occurredAt": "2026-02-17T10:00:00Z",
            "eventName": "collector_connection",
            "actionName": "connect",
            "operatorLabel": "operator-1",
            "connectionType": "bluetooth",
            "collectorUuid": "550e8400-e29b-41d4-a716-446655440072",
            "context": {
                "signalRssi": -64
            },
            "request": {
                "source": "mobile"
            },
            "result": {
                "status": "success"
            },
            "geo": {
                "lat": 33.4484,
                "lng": -112.074
            }
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/mobile/audit-events',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'deviceUuid' => '550e8400-e29b-41d4-a716-446655440070',
            'events' => [
                [
                    'eventUuid' => '550e8400-e29b-41d4-a716-446655440071',
                    'occurredAt' => '2026-02-17T10:00:00Z',
                    'eventName' => 'collector_connection',
                    'actionName' => 'connect',
                    'operatorLabel' => 'operator-1',
                    'connectionType' => 'bluetooth',
                    'collectorUuid' => '550e8400-e29b-41d4-a716-446655440072',
                    'context' => [
                        'signalRssi' => -64,
                    ],
                    'request' => [
                        'source' => 'mobile',
                    ],
                    'result' => [
                        'status' => 'success',
                    ],
                    'geo' => [
                        'lat' => 33.4484,
                        'lng' => -112.074,
                    ],
                ],
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/mobile/audit-events'
payload = {
    "deviceUuid": "550e8400-e29b-41d4-a716-446655440070",
    "events": [
        {
            "eventUuid": "550e8400-e29b-41d4-a716-446655440071",
            "occurredAt": "2026-02-17T10:00:00Z",
            "eventName": "collector_connection",
            "actionName": "connect",
            "operatorLabel": "operator-1",
            "connectionType": "bluetooth",
            "collectorUuid": "550e8400-e29b-41d4-a716-446655440072",
            "context": {
                "signalRssi": -64
            },
            "request": {
                "source": "mobile"
            },
            "result": {
                "status": "success"
            },
            "geo": {
                "lat": 33.4484,
                "lng": -112.074
            }
        }
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/mobile/audit-events

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

company   string   

The slug of the company Example: aut

Body Parameters

deviceUuid   string   

UUID of the mobile device uploading audit events. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440070

events   object[]   

Batch of audit events (1 to 100 items). Must have at least 1 items. Must not have more than 100 items.

eventUuid   string   

Must be a valid UUID. Example: 49542a53-089b-3863-bddb-01091d34d736

occurredAt   string   

Must be a valid date. Example: 2026-03-26T23:05:09

eventName   string   

The slug of an existing record in the mobile_audit_event_types table. Example: officiis

actionName   string   

The slug of an existing record in the mobile_audit_action_types table. Example: pariatur

operatorLabel   string  optional  

Must not be greater than 255 characters. Example: dukqtlmwinvernr

connectionType   string  optional  

Example: sint

collectorUuid   string  optional  

Must be a valid UUID. Example: d19db235-158b-3856-8d22-914cbf20f11a

context   object  optional  
request   object  optional  
result   object  optional  
geo   object  optional  
lat   number  optional  

This field is required when events.*.geo is present. Must be between -90 and 90. Example: -90

lng   number  optional  

This field is required when events.*.geo is present. Must be between -180 and 180. Example: -179

Upload NCU measurement and parameter data.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/mobile/ncu-data" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"deviceUuid\": \"550e8400-e29b-41d4-a716-446655440080\",
    \"batchUuid\": \"550e8400-e29b-41d4-a716-446655440081\",
    \"collectorUuid\": \"550e8400-e29b-41d4-a716-446655440082\",
    \"measurements\": [
        {
            \"timestamp\": \"2026-02-17T10:05:00Z\",
            \"data\": {
                \"ambientTemp\": 31.2
            }
        }
    ],
    \"parameters\": {
        \"firmwareVersion\": \"1.18.4\",
        \"mode\": \"auto\"
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/mobile/ncu-data"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "deviceUuid": "550e8400-e29b-41d4-a716-446655440080",
    "batchUuid": "550e8400-e29b-41d4-a716-446655440081",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440082",
    "measurements": [
        {
            "timestamp": "2026-02-17T10:05:00Z",
            "data": {
                "ambientTemp": 31.2
            }
        }
    ],
    "parameters": {
        "firmwareVersion": "1.18.4",
        "mode": "auto"
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/mobile/ncu-data',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'deviceUuid' => '550e8400-e29b-41d4-a716-446655440080',
            'batchUuid' => '550e8400-e29b-41d4-a716-446655440081',
            'collectorUuid' => '550e8400-e29b-41d4-a716-446655440082',
            'measurements' => [
                [
                    'timestamp' => '2026-02-17T10:05:00Z',
                    'data' => [
                        'ambientTemp' => 31.2,
                    ],
                ],
            ],
            'parameters' => [
                'firmwareVersion' => '1.18.4',
                'mode' => 'auto',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/mobile/ncu-data'
payload = {
    "deviceUuid": "550e8400-e29b-41d4-a716-446655440080",
    "batchUuid": "550e8400-e29b-41d4-a716-446655440081",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440082",
    "measurements": [
        {
            "timestamp": "2026-02-17T10:05:00Z",
            "data": {
                "ambientTemp": 31.2
            }
        }
    ],
    "parameters": {
        "firmwareVersion": "1.18.4",
        "mode": "auto"
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/mobile/ncu-data

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

deviceUuid   string   

UUID of the mobile device sending the batch. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440080

batchUuid   string   

UUID identifying this upload batch. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440081

collectorUuid   string   

UUID of the collector associated with the uploaded data. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440082

measurements   object[]  optional  

Optional measurement entries captured in the field.

timestamp   string   

Must be a valid date. Example: 2026-03-26T23:05:09

parameters   object  optional  

Optional parameter snapshots captured in the same batch.

Upload NCU raw log file.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/tracklab/mobile/ncu-logs" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "deviceUuid=550e8400-e29b-41d4-a716-446655440090" \
    --form "collectorUuid=550e8400-e29b-41d4-a716-446655440091" \
    --form "notes=Captured right after an intermittent disconnect." \
    --form "logFile=@/site/web/tests/Fixtures/mobile/ncu-log-example.txt" 
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/tracklab/mobile/ncu-logs"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('deviceUuid', '550e8400-e29b-41d4-a716-446655440090');
body.append('collectorUuid', '550e8400-e29b-41d4-a716-446655440091');
body.append('notes', 'Captured right after an intermittent disconnect.');
body.append('logFile', document.querySelector('input[name="logFile"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/tracklab/mobile/ncu-logs',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'deviceUuid',
                'contents' => '550e8400-e29b-41d4-a716-446655440090'
            ],
            [
                'name' => 'collectorUuid',
                'contents' => '550e8400-e29b-41d4-a716-446655440091'
            ],
            [
                'name' => 'notes',
                'contents' => 'Captured right after an intermittent disconnect.'
            ],
            [
                'name' => 'logFile',
                'contents' => fopen('/site/web/tests/Fixtures/mobile/ncu-log-example.txt', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/tracklab/mobile/ncu-logs'
files = {
  'logFile': open('/site/web/tests/Fixtures/mobile/ncu-log-example.txt', 'rb')
}
payload = {
    "deviceUuid": "550e8400-e29b-41d4-a716-446655440090",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440091",
    "notes": "Captured right after an intermittent disconnect."
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'multipart/form-data',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, files=files, data=payload)
response.json()

Request      

POST api/v1/c/{company_slug}/mobile/ncu-logs

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: multipart/form-data

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

deviceUuid   string   

UUID of the mobile device uploading the log file. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440090

collectorUuid   string   

UUID of the collector referenced by the log. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440091

logFile   file   

Log file upload (max 10MB). Must be a file. Must not be greater than 10240 kilobytes. Example: /site/web/tests/Fixtures/mobile/ncu-log-example.txt

notes   string  optional  

Optional operator notes for the uploaded logs. Must not be greater than 1000 characters. Example: Captured right after an intermittent disconnect.

List all enabled document library sections.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/doc-lib/sections" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/doc-lib/sections"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/doc-lib/sections',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/doc-lib/sections'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/doc-lib/sections

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

List all enabled categories for a section.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/doc-lib/sections/{section_uuid}/categories

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

List all enabled documents for a category.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/doc-lib/sections/{section_uuid}/categories/{category_uuid}/documents

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

category_uuid   string   

Example: 6d8ce9e4-ee38-432f-b75b-6834ef1d21bd

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/icon-link" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"expiryMinutes\": 10
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/icon-link"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "expiryMinutes": 10
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/icon-link',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'expiryMinutes' => 10,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/icon-link'
payload = {
    "expiryMinutes": 10
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/icon-link" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"expiryMinutes\": 10
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/icon-link"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "expiryMinutes": 10
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/icon-link',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'expiryMinutes' => 10,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/icon-link'
payload = {
    "expiryMinutes": 10
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/doc-lib/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/icon-link" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"expiryMinutes\": 10
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/doc-lib/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/icon-link"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "expiryMinutes": 10
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/doc-lib/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/icon-link',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'expiryMinutes' => 10,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/doc-lib/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/icon-link'
payload = {
    "expiryMinutes": 10
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/download-link" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"expiryMinutes\": 10
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/download-link"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "expiryMinutes": 10
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/download-link',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'expiryMinutes' => 10,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/download-link'
payload = {
    "expiryMinutes": 10
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

POST api/v1/email/resend

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/email/resend" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/email/resend"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/email/resend',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/email/resend'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/email/resend

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get Profile Picture

requires authentication

Retrieve the authenticated user's profile picture. Supports token authentication via query parameter for use in image tags where Bearer tokens cannot be sent.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/me/profile/picture/square-48-webp?token=54%7CVYSnJgtQsXZWN45UOPc3y16VArMBQ1KM1eMdIxLR417e6478" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/profile/picture/square-48-webp"
);

const params = {
    "token": "54|VYSnJgtQsXZWN45UOPc3y16VArMBQ1KM1eMdIxLR417e6478",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/me/profile/picture/square-48-webp',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'token' => '54|VYSnJgtQsXZWN45UOPc3y16VArMBQ1KM1eMdIxLR417e6478',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/profile/picture/square-48-webp'
params = {
  'token': '54|VYSnJgtQsXZWN45UOPc3y16VArMBQ1KM1eMdIxLR417e6478',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


The image file stream
 

Example response (401):


{
    "message": "Unauthenticated."
}
 

Example response (404):


{
    "message": "Profile picture not found."
}
 

Request      

GET api/v1/me/profile/picture/{format}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

format   string  optional  

The image format/conversion name. Example: square-48-webp

Query Parameters

token   string  optional  

Optional Sanctum token for img src authentication. Example: 54|VYSnJgtQsXZWN45UOPc3y16VArMBQ1KM1eMdIxLR417e6478

Get Current User

requires authentication

Retrieves the complete profile information for the currently authenticated user. This includes personal details, contact information, profile picture URLs, and assigned roles. The endpoint provides a comprehensive view of the user's account data and preferences.

This endpoint is commonly used after login to initialize the user's session with their full profile data, or to refresh the local cache of user information.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/me" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/me',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "email": "john@example.com",
        "firstName": "John",
        "lastName": "Doe",
        "phone_number": "+1234567890",
        "created_at": "2024-01-20T12:00:00Z",
        "updated_at": "2024-01-20T12:00:00Z",
        "profile_picture_url": "https://example.com/profiles/john.jpg",
        "roles": [
            "user"
        ]
    }
}
 

Request      

GET api/v1/me

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Check Authentication Status

Verifies if the current user has a valid authentication session. This endpoint can be used by clients to validate their authentication state without making a full profile request. It's particularly useful for SPA applications to check if their session is still valid.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/me/check" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/check"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/me/check',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/check'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "success": true
}
 

Example response (401):


{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/me/check

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Get User Companies

requires authentication

Retrieve all companies associated with the authenticated user.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/me/company" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/company"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/me/company',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/company'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "slug": "example-company",
            "createdAt": "2024-01-20T12:00:00Z",
            "updatedAt": "2024-01-20T12:00:00Z",
            "enabled": true,
            "defaultCountryIsoCode": "ZA",
            "country": {
                "isoCode": "ZA",
                "name": "South Africa",
                "emoji": "🇿🇦"
            },
            "name": "Example Company",
            "logoUrl": null,
            "logoThumbUrl": null,
            "logoLargeUrl": null,
            "logoUrlExpiresAt": null,
            "favicons": null
        }
    ],
    "links": {
        "first": "https://api.example.com/api/v1/me/companies?page=1",
        "last": "https://api.example.com/api/v1/me/companies?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "total": 1,
        "perPage": 15,
        "currentPage": 1,
        "lastPage": 1,
        "from": 1,
        "to": 1,
        "hasMore": false,
        "path": "https://api.example.com/api/v1/me/companies"
    }
}
 

Request      

GET api/v1/me/company

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/me/addresses

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/me/addresses" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/addresses"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/me/addresses',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/addresses'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/me/addresses

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

POST api/v1/me/addresses

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/addresses" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"addressString\": \"123 Main St, London SW1A 1AA\",
    \"addressLine1\": \"123 Main Street\",
    \"city\": \"London\",
    \"postCode\": \"SW1A 1AA\",
    \"countryIsoCode\": \"GB\",
    \"addressLine2\": \"Apt 4B\",
    \"neighborhood\": \"Westminster\",
    \"locality\": \"Central London\",
    \"place\": \"Piccadilly Circus\",
    \"district\": \"City of Westminster\",
    \"region\": \"Greater London\",
    \"location\": {
        \"lat\": 51.5074,
        \"long\": -0.1278,
        \"latitude\": 51.5074,
        \"longitude\": -0.1278
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/addresses"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "addressString": "123 Main St, London SW1A 1AA",
    "addressLine1": "123 Main Street",
    "city": "London",
    "postCode": "SW1A 1AA",
    "countryIsoCode": "GB",
    "addressLine2": "Apt 4B",
    "neighborhood": "Westminster",
    "locality": "Central London",
    "place": "Piccadilly Circus",
    "district": "City of Westminster",
    "region": "Greater London",
    "location": {
        "lat": 51.5074,
        "long": -0.1278,
        "latitude": 51.5074,
        "longitude": -0.1278
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/addresses',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'addressString' => '123 Main St, London SW1A 1AA',
            'addressLine1' => '123 Main Street',
            'city' => 'London',
            'postCode' => 'SW1A 1AA',
            'countryIsoCode' => 'GB',
            'addressLine2' => 'Apt 4B',
            'neighborhood' => 'Westminster',
            'locality' => 'Central London',
            'place' => 'Piccadilly Circus',
            'district' => 'City of Westminster',
            'region' => 'Greater London',
            'location' => [
                'lat' => 51.5074,
                'long' => -0.1278,
                'latitude' => 51.5074,
                'longitude' => -0.1278,
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/addresses'
payload = {
    "addressString": "123 Main St, London SW1A 1AA",
    "addressLine1": "123 Main Street",
    "city": "London",
    "postCode": "SW1A 1AA",
    "countryIsoCode": "GB",
    "addressLine2": "Apt 4B",
    "neighborhood": "Westminster",
    "locality": "Central London",
    "place": "Piccadilly Circus",
    "district": "City of Westminster",
    "region": "Greater London",
    "location": {
        "lat": 51.5074,
        "long": -0.1278,
        "latitude": 51.5074,
        "longitude": -0.1278
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/me/addresses

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

addressString   string  optional  

Full address as a single string. If provided, individual address fields are not required. Must not be greater than 500 characters. Example: 123 Main St, London SW1A 1AA

addressLine1   string   

First line of the address (required if addressString not provided). Must not be greater than 255 characters. Example: 123 Main Street

city   string   

City name (required if addressString not provided). Must not be greater than 255 characters. Example: London

postCode   string   

Postal code (required if addressString not provided). Must not be greater than 20 characters. Example: SW1A 1AA

countryIsoCode   string   

Two-letter ISO country code. The iso_code of an existing record in the countries table. Example: GB

addressLine2   string  optional  

Second line of the address. Must not be greater than 255 characters. Example: Apt 4B

neighborhood   string  optional  

Neighborhood name. Must not be greater than 255 characters. Example: Westminster

locality   string  optional  

Locality name. Must not be greater than 255 characters. Example: Central London

place   string  optional  

Place name. Must not be greater than 255 characters. Example: Piccadilly Circus

district   string  optional  

District name. Must not be greater than 255 characters. Example: City of Westminster

region   string  optional  

Region name. Must not be greater than 255 characters. Example: Greater London

location   object  optional  

Geographic coordinates (supports both latitude/longitude and lat/long formats).

latitude   number  optional  

Latitude coordinate (required if location object is provided). This field is required when location is present. Example: 51.5074

longitude   number  optional  

Longitude coordinate (required if location object is provided). This field is required when location is present. Example: -0.1278

Get User Roles

requires authentication

Retrieve all roles assigned to the authenticated user.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/me/role" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/role"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/me/role',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/role'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "success": true,
    "data": {
        "acme-co": [
            "admin",
            "user"
        ],
        "tracklab": [
            "tracklab-support"
        ]
    }
}
 

Request      

GET api/v1/me/role

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get User Permissions

requires authentication

Retrieve all permissions assigned to the authenticated user, grouped by company slug.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/me/permissions" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/permissions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/me/permissions',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/permissions'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "success": true,
    "data": {
        "acme-co": [
            "collectors.view",
            "collectors.update"
        ],
        "tracklab": [
            "tracklab.users.view"
        ]
    }
}
 

Request      

GET api/v1/me/permissions

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/me/realtime/bootstrap

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/me/realtime/bootstrap" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/realtime/bootstrap"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/me/realtime/bootstrap',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/realtime/bootstrap'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/me/realtime/bootstrap

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Update Profile Picture

requires authentication

Upload or update the user's profile picture.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/profile/picture" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "file=@/tmp/php5hg0gppje80fdqrqkyU" 
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/profile/picture"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('file', document.querySelector('input[name="file"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/profile/picture',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'file',
                'contents' => fopen('/tmp/php5hg0gppje80fdqrqkyU', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/profile/picture'
files = {
  'file': open('/tmp/php5hg0gppje80fdqrqkyU', 'rb')
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'multipart/form-data',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, files=files)
response.json()

Example response (200):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "email": "john@example.com",
        "firstName": "John",
        "lastName": "Doe",
        "profile_picture_url": "https://example.com/profiles/new-picture.jpg",
        "updated_at": "2024-01-20T12:00:00Z"
    }
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "file": [
            "The file must be an image.",
            "The file failed to upload."
        ]
    }
}
 

Request      

POST api/v1/me/profile/picture

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: multipart/form-data

Accept      

Example: application/json

Body Parameters

file   file   

The image file to upload. Must be an image (jpeg, png, etc). Example: /tmp/php5hg0gppje80fdqrqkyU

Generate Signed Asset URLs

requires authentication

Generate time-limited signed URLs for protected assets. These URLs can be used in img tags without requiring bearer token authentication.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/assets/signed-urls" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"assetType\": \"profile_picture\",
    \"expiryMinutes\": 120
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/assets/signed-urls"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "assetType": "profile_picture",
    "expiryMinutes": 120
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/assets/signed-urls',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'assetType' => 'profile_picture',
            'expiryMinutes' => 120,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/assets/signed-urls'
payload = {
    "assetType": "profile_picture",
    "expiryMinutes": 120
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "assetType": "profile_picture",
        "urls": {
            "imgUrl": "https://example.com/api/v1/me/profile/picture/uuid/square-256-webp?expires=...",
            "imgThumbUrl": "https://example.com/api/v1/me/profile/picture/uuid/square-48-webp?expires=..."
        },
        "expiresAt": "2024-01-20T13:00:00Z"
    }
}
 

Request      

POST api/v1/me/assets/signed-urls

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

assetType   string   

The type of asset. Currently supports: profile_picture. Example: profile_picture

expiryMinutes   integer  optional  

The URL expiry time in minutes (1-1440, default 60). Example: 120

POST api/v1/me/document

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/document" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"documentTypeSlug\": \"proof-of-address\",
    \"file\": \"consequatur\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/document"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "documentTypeSlug": "proof-of-address",
    "file": "consequatur"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/document',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'documentTypeSlug' => 'proof-of-address',
            'file' => 'consequatur',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/document'
payload = {
    "documentTypeSlug": "proof-of-address",
    "file": "consequatur"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/me/document

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

documentTypeSlug   string   

Slug of the document type being uploaded. The slug of an existing record in the document_types table. Example: proof-of-address

file   string   

The document file (must be an image). Example: consequatur

GET api/v1/me/document/{format}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/me/document/libero?documentTypeSlug=proof-of-address" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/document/libero"
);

const params = {
    "documentTypeSlug": "proof-of-address",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/me/document/libero',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'documentTypeSlug' => 'proof-of-address',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/document/libero'
params = {
  'documentTypeSlug': 'proof-of-address',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/me/document/{format}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

format   string   

Example: libero

Query Parameters

documentTypeSlug   string   

Slug of the document type to retrieve. The slug of an existing record in the document_types table. Example: proof-of-address

Update User Name

requires authentication

Update the authenticated user's first and last name.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/name" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"firstName\": \"John\",
    \"lastName\": \"Doe\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/name"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "firstName": "John",
    "lastName": "Doe"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/name',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'firstName' => 'John',
            'lastName' => 'Doe',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/name'
payload = {
    "firstName": "John",
    "lastName": "Doe"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "email": "john@example.com",
        "firstName": "John",
        "lastName": "Doe",
        "updated_at": "2024-01-20T12:00:00Z"
    }
}
 

Request      

POST api/v1/me/name

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

firstName   string   

The user's first name. Example: John

lastName   string   

The user's last name. Example: Doe

Update User Email

requires authentication

Update the authenticated user's email address.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/email" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"newemail@example.com\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/email"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "newemail@example.com"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/email',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'newemail@example.com',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/email'
payload = {
    "email": "newemail@example.com"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "email": "newemail@example.com",
        "firstName": "John",
        "lastName": "Doe",
        "updated_at": "2024-01-20T12:00:00Z"
    }
}
 

Request      

POST api/v1/me/email

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

email   string   

The new email address. Example: newemail@example.com

Update Phone Number

requires authentication

Update the authenticated user's phone number.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/phonenumber" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"countryIsoCode\": \"US\",
    \"phoneNumber\": \"+1234567890\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/phonenumber"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "countryIsoCode": "US",
    "phoneNumber": "+1234567890"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/phonenumber',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'countryIsoCode' => 'US',
            'phoneNumber' => '+1234567890',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/phonenumber'
payload = {
    "countryIsoCode": "US",
    "phoneNumber": "+1234567890"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "phone_number": "+1234567890",
        "updated_at": "2024-01-20T12:00:00Z"
    }
}
 

Request      

POST api/v1/me/phonenumber

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

countryIsoCode   string   

The ISO code of the user's country. Example: US

phoneNumber   string   

The new phone number. Example: +1234567890

Update Password

requires authentication

Update the authenticated user's password.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/password" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"oldPassword\": \"currentPass123\",
    \"password\": \"newSecurePass123!\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/password"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "oldPassword": "currentPass123",
    "password": "newSecurePass123!"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/password',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'oldPassword' => 'currentPass123',
            'password' => 'newSecurePass123!',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/password'
payload = {
    "oldPassword": "currentPass123",
    "password": "newSecurePass123!"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "updated_at": "2024-01-20T12:00:00Z"
    }
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "oldPassword": [
            "The provided password is incorrect."
        ],
        "password": [
            "The password must be at least 10 characters."
        ]
    }
}
 

Request      

POST api/v1/me/password

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

oldPassword   string   

The current password. Example: currentPass123

password   string   

The new password (min 10 characters). Example: newSecurePass123!

Update Default Country

requires authentication

Update the authenticated user's default country.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/country/default" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"countryIsoCode\": \"US\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/country/default"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "countryIsoCode": "US"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/country/default',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'countryIsoCode' => 'US',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/country/default'
payload = {
    "countryIsoCode": "US"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "updated_at": "2024-01-20T12:00:00Z"
    }
}
 

Request      

POST api/v1/me/country/default

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

countryIsoCode   string   

The ISO code of the country. Example: US

Update Default Company

requires authentication

Update the authenticated user's default company. The user must belong to the target company (via user_companies relationship).

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/company/default" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"companySlug\": \"acme-corp\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/company/default"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "companySlug": "acme-corp"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/company/default',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'companySlug' => 'acme-corp',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/company/default'
payload = {
    "companySlug": "acme-corp"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "defaultCompanySlug": "acme-corp",
        "updated_at": "2024-01-20T12:00:00Z"
    }
}
 

Example response (403):


{
    "message": "User does not belong to this company"
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "companySlug": [
            "The selected companySlug is invalid."
        ]
    }
}
 

Request      

POST api/v1/me/company/default

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

companySlug   string   

The slug of the company to set as default. Example: acme-corp

Delete Current User Account

requires authentication

Soft-delete the authenticated user and revoke all tokens.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/delete" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/delete"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/delete',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/delete'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/me/delete

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

POST api/v1/me/2fa/enable

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/2fa/enable" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/2fa/enable"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/2fa/enable',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/2fa/enable'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/me/2fa/enable

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

POST api/v1/me/2fa/verify

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/2fa/verify" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"code\": \"123456\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/2fa/verify"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "code": "123456"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/2fa/verify',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'code' => '123456',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/2fa/verify'
payload = {
    "code": "123456"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/me/2fa/verify

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

code   string   

The current two-factor authentication code. Example: 123456

POST api/v1/me/2fa/disable

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/2fa/disable" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/2fa/disable"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/2fa/disable',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/2fa/disable'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/me/2fa/disable

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/me/sessions

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/me/sessions" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/sessions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/me/sessions',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/sessions'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/me/sessions

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

POST api/v1/me/sessions/revoke

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/sessions/revoke" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"sessionId\": \"550e8400-e29b-41d4-a716-446655440000\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/sessions/revoke"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "sessionId": "550e8400-e29b-41d4-a716-446655440000"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/sessions/revoke',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'sessionId' => '550e8400-e29b-41d4-a716-446655440000',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/sessions/revoke'
payload = {
    "sessionId": "550e8400-e29b-41d4-a716-446655440000"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/me/sessions/revoke

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

sessionId   string   

The UUID of the session to revoke. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

POST api/v1/me/sessions/revoke-all

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/sessions/revoke-all" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/sessions/revoke-all"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/sessions/revoke-all',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/sessions/revoke-all'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/me/sessions/revoke-all

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Register or Update Mobile Device

requires authentication

Registers a new mobile device for the authenticated user, or updates an existing device if the deviceUuid already belongs to this user. Returns 403 if the deviceUuid belongs to a different user.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/me/mobile/devices" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"deviceUuid\": \"550e8400-e29b-41d4-a716-446655440000\",
    \"platform\": \"android\",
    \"deviceModel\": \"Pixel 7 Pro\",
    \"osVersion\": \"14.0\",
    \"appVersion\": \"1.0.0\",
    \"buildNumber\": \"42\",
    \"pushToken\": \"fcm-token-here\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/mobile/devices"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "deviceUuid": "550e8400-e29b-41d4-a716-446655440000",
    "platform": "android",
    "deviceModel": "Pixel 7 Pro",
    "osVersion": "14.0",
    "appVersion": "1.0.0",
    "buildNumber": "42",
    "pushToken": "fcm-token-here"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/me/mobile/devices',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'deviceUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'platform' => 'android',
            'deviceModel' => 'Pixel 7 Pro',
            'osVersion' => '14.0',
            'appVersion' => '1.0.0',
            'buildNumber' => '42',
            'pushToken' => 'fcm-token-here',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/mobile/devices'
payload = {
    "deviceUuid": "550e8400-e29b-41d4-a716-446655440000",
    "platform": "android",
    "deviceModel": "Pixel 7 Pro",
    "osVersion": "14.0",
    "appVersion": "1.0.0",
    "buildNumber": "42",
    "pushToken": "fcm-token-here"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/me/mobile/devices

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

deviceUuid   string   

Unique identifier for the mobile device. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

platform   string   

Mobile platform slug (android or ios). Example: android

deviceModel   string  optional  

Device hardware model name. Must not be greater than 255 characters. Example: Pixel 7 Pro

osVersion   string  optional  

Operating system version. Must not be greater than 100 characters. Example: 14.0

appVersion   string  optional  

Application version string. Must not be greater than 100 characters. Example: 1.0.0

buildNumber   string  optional  

Application build number. Must not be greater than 100 characters. Example: 42

pushToken   string  optional  

Push notification token (FCM or APNs). Must not be greater than 500 characters. Example: fcm-token-here

Update Mobile Device Metadata

requires authentication

Updates partial metadata on an existing mobile device (appVersion, buildNumber, pushToken, etc.). The device must belong to the authenticated user.

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/me/mobile/devices/cd0c5477-bb27-31be-8515-d13424e5025a" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"deviceModel\": \"Pixel 7 Pro\",
    \"osVersion\": \"14.0\",
    \"appVersion\": \"1.0.0\",
    \"buildNumber\": \"42\",
    \"pushToken\": \"fcm-token-here\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/mobile/devices/cd0c5477-bb27-31be-8515-d13424e5025a"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "deviceModel": "Pixel 7 Pro",
    "osVersion": "14.0",
    "appVersion": "1.0.0",
    "buildNumber": "42",
    "pushToken": "fcm-token-here"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/me/mobile/devices/cd0c5477-bb27-31be-8515-d13424e5025a',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'deviceModel' => 'Pixel 7 Pro',
            'osVersion' => '14.0',
            'appVersion' => '1.0.0',
            'buildNumber' => '42',
            'pushToken' => 'fcm-token-here',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/mobile/devices/cd0c5477-bb27-31be-8515-d13424e5025a'
payload = {
    "deviceModel": "Pixel 7 Pro",
    "osVersion": "14.0",
    "appVersion": "1.0.0",
    "buildNumber": "42",
    "pushToken": "fcm-token-here"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/me/mobile/devices/{deviceUuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

deviceUuid   string   

Example: cd0c5477-bb27-31be-8515-d13424e5025a

Body Parameters

deviceModel   string  optional  

Device hardware model name. Must not be greater than 255 characters. Example: Pixel 7 Pro

osVersion   string  optional  

Operating system version. Must not be greater than 100 characters. Example: 14.0

appVersion   string  optional  

Application version string. Must not be greater than 100 characters. Example: 1.0.0

buildNumber   string  optional  

Application build number. Must not be greater than 100 characters. Example: 42

pushToken   string  optional  

Push notification token (FCM or APNs). Must not be greater than 500 characters. Example: fcm-token-here

Get Sync Status

requires authentication

Returns server time, feature flags, and limits for mobile clients to configure their sync behavior.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/me/mobile/sync-status" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/mobile/sync-status"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/me/mobile/sync-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/mobile/sync-status'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/me/mobile/sync-status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/sa/c/{company_slug}/automation-rules

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/automation-rules

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

POST api/v1/sa/c/{company_slug}/automation-rules

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"companySlug\": \"acme-solar\",
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440101\",
    \"collectorUuid\": \"550e8400-e29b-41d4-a716-446655440102\",
    \"status\": \"enabled\",
    \"name\": \"High Wind Stow Rule\",
    \"description\": \"Stows trackers when wind speed exceeds threshold.\",
    \"cooldownMinutes\": 15,
    \"autoClear\": true,
    \"clearAfterSeconds\": 300,
    \"evaluationPeriodSeconds\": 60,
    \"evaluationCountThreshold\": 3
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "companySlug": "acme-solar",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440101",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440102",
    "status": "enabled",
    "name": "High Wind Stow Rule",
    "description": "Stows trackers when wind speed exceeds threshold.",
    "cooldownMinutes": 15,
    "autoClear": true,
    "clearAfterSeconds": 300,
    "evaluationPeriodSeconds": 60,
    "evaluationCountThreshold": 3
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'companySlug' => 'acme-solar',
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440101',
            'collectorUuid' => '550e8400-e29b-41d4-a716-446655440102',
            'status' => 'enabled',
            'name' => 'High Wind Stow Rule',
            'description' => 'Stows trackers when wind speed exceeds threshold.',
            'cooldownMinutes' => 15,
            'autoClear' => true,
            'clearAfterSeconds' => 300,
            'evaluationPeriodSeconds' => 60,
            'evaluationCountThreshold' => 3,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules'
payload = {
    "companySlug": "acme-solar",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440101",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440102",
    "status": "enabled",
    "name": "High Wind Stow Rule",
    "description": "Stows trackers when wind speed exceeds threshold.",
    "cooldownMinutes": 15,
    "autoClear": true,
    "clearAfterSeconds": 300,
    "evaluationPeriodSeconds": 60,
    "evaluationCountThreshold": 3
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/automation-rules

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

companySlug   string  optional  

Company scope slug. Provide exactly one scope field. The slug of an existing record in the companies table. Example: acme-solar

farmUuid   string  optional  

Farm scope UUID. Provide exactly one scope field. Must be a valid UUID. The uuid of an existing record in the farms table. Example: 550e8400-e29b-41d4-a716-446655440101

collectorUuid   string  optional  

Collector scope UUID. Provide exactly one scope field. Must be a valid UUID. The uuid of an existing record in the collectors table. Example: 550e8400-e29b-41d4-a716-446655440102

status   string   

Automation rule status slug. The slug of an existing record in the automation_rule_status_types table. Example: enabled

name   string   

Automation rule name. Must not be greater than 255 characters. Example: High Wind Stow Rule

description   string  optional  

Automation rule description. Example: Stows trackers when wind speed exceeds threshold.

cooldownMinutes   integer  optional  

Cooldown between rule triggers in minutes. Must be at least 0. Example: 15

autoClear   boolean  optional  

Whether the rule should auto-clear. Example: true

clearAfterSeconds   integer  optional  

Seconds after which the rule auto-clears. Must be at least 0. Example: 300

evaluationPeriodSeconds   integer  optional  

Evaluation period in seconds. Must be at least 0. Example: 60

evaluationCountThreshold   integer  optional  

Number of breaches required in the evaluation period. Must be at least 0. Example: 3

GET api/v1/sa/c/{company_slug}/automation-rules/{automationRule_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules/f581f30c-6b48-3a74-85e7-64bb38d7158c" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules/f581f30c-6b48-3a74-85e7-64bb38d7158c"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules/f581f30c-6b48-3a74-85e7-64bb38d7158c',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules/f581f30c-6b48-3a74-85e7-64bb38d7158c'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/automation-rules/{automationRule_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationRule_uuid   string   

Example: f581f30c-6b48-3a74-85e7-64bb38d7158c

PUT api/v1/sa/c/{company_slug}/automation-rules/{automationRule_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules/2935c460-ec38-3387-88ca-aedcba0ae51f" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"status\": \"disabled\",
    \"name\": \"High Wind Stow Rule\",
    \"description\": \"Updated description for wind stow rule.\",
    \"cooldownMinutes\": 30,
    \"autoClear\": true,
    \"clearAfterSeconds\": 600,
    \"evaluationPeriodSeconds\": 120,
    \"evaluationCountThreshold\": 2
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules/2935c460-ec38-3387-88ca-aedcba0ae51f"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "status": "disabled",
    "name": "High Wind Stow Rule",
    "description": "Updated description for wind stow rule.",
    "cooldownMinutes": 30,
    "autoClear": true,
    "clearAfterSeconds": 600,
    "evaluationPeriodSeconds": 120,
    "evaluationCountThreshold": 2
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules/2935c460-ec38-3387-88ca-aedcba0ae51f',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'status' => 'disabled',
            'name' => 'High Wind Stow Rule',
            'description' => 'Updated description for wind stow rule.',
            'cooldownMinutes' => 30,
            'autoClear' => true,
            'clearAfterSeconds' => 600,
            'evaluationPeriodSeconds' => 120,
            'evaluationCountThreshold' => 2,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules/2935c460-ec38-3387-88ca-aedcba0ae51f'
payload = {
    "status": "disabled",
    "name": "High Wind Stow Rule",
    "description": "Updated description for wind stow rule.",
    "cooldownMinutes": 30,
    "autoClear": true,
    "clearAfterSeconds": 600,
    "evaluationPeriodSeconds": 120,
    "evaluationCountThreshold": 2
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/sa/c/{company_slug}/automation-rules/{automationRule_uuid}

PATCH api/v1/sa/c/{company_slug}/automation-rules/{automationRule_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationRule_uuid   string   

Example: 2935c460-ec38-3387-88ca-aedcba0ae51f

Body Parameters

status   string  optional  

Automation rule status slug. The slug of an existing record in the automation_rule_status_types table. Example: disabled

name   string  optional  

Automation rule name. Must not be greater than 255 characters. Example: High Wind Stow Rule

description   string  optional  

Automation rule description. Example: Updated description for wind stow rule.

cooldownMinutes   integer  optional  

Cooldown between rule triggers in minutes. Must be at least 0. Example: 30

autoClear   boolean  optional  

Whether the rule should auto-clear. Example: true

clearAfterSeconds   integer  optional  

Seconds after which the rule auto-clears. Must be at least 0. Example: 600

evaluationPeriodSeconds   integer  optional  

Evaluation period in seconds. Must be at least 0. Example: 120

evaluationCountThreshold   integer  optional  

Number of breaches required in the evaluation period. Must be at least 0. Example: 2

DELETE api/v1/sa/c/{company_slug}/automation-rules/{automationRule_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules/ea7fc462-0684-3df5-b64d-67887d4d9ab9" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules/ea7fc462-0684-3df5-b64d-67887d4d9ab9"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules/ea7fc462-0684-3df5-b64d-67887d4d9ab9',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-rules/ea7fc462-0684-3df5-b64d-67887d4d9ab9'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}/automation-rules/{automationRule_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationRule_uuid   string   

Example: ea7fc462-0684-3df5-b64d-67887d4d9ab9

GET api/v1/sa/c/{company_slug}/automation-webhook-sources

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/automation-webhook-sources

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

POST api/v1/sa/c/{company_slug}/automation-webhook-sources

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Farm Weather Provider\",
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440020\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Farm Weather Provider",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440020"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Farm Weather Provider',
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440020',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources'
payload = {
    "name": "Farm Weather Provider",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440020"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/automation-webhook-sources

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

name   string   

Human-readable name for the inbound webhook source. Must not be greater than 255 characters. Example: Farm Weather Provider

farmUuid   string  optional  

Optional farm UUID to scope this source to one farm. Must be a valid UUID. The uuid of an existing record in the farms table. Example: 550e8400-e29b-41d4-a716-446655440020

GET api/v1/sa/c/{company_slug}/automation-webhook-sources/{automationInboundWebhookSource_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources/82f764e1-4611-3048-b203-aa182a730f74" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources/82f764e1-4611-3048-b203-aa182a730f74"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources/82f764e1-4611-3048-b203-aa182a730f74',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources/82f764e1-4611-3048-b203-aa182a730f74'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/automation-webhook-sources/{automationInboundWebhookSource_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationInboundWebhookSource_uuid   string   

Example: 82f764e1-4611-3048-b203-aa182a730f74

DELETE api/v1/sa/c/{company_slug}/automation-webhook-sources/{automationInboundWebhookSource_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources/cfb66508-ddd5-3f5e-959d-e2764857a6e5" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources/cfb66508-ddd5-3f5e-959d-e2764857a6e5"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources/cfb66508-ddd5-3f5e-959d-e2764857a6e5',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources/cfb66508-ddd5-3f5e-959d-e2764857a6e5'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}/automation-webhook-sources/{automationInboundWebhookSource_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationInboundWebhookSource_uuid   string   

Example: cfb66508-ddd5-3f5e-959d-e2764857a6e5

POST api/v1/sa/c/{company_slug}/automation-webhook-sources/{automationInboundWebhookSource_uuid}/rotate

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources/f467d3b6-63ea-3eb4-896f-a9c97ff6f92a/rotate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources/f467d3b6-63ea-3eb4-896f-a9c97ff6f92a/rotate"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources/f467d3b6-63ea-3eb4-896f-a9c97ff6f92a/rotate',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-webhook-sources/f467d3b6-63ea-3eb4-896f-a9c97ff6f92a/rotate'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/automation-webhook-sources/{automationInboundWebhookSource_uuid}/rotate

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationInboundWebhookSource_uuid   string   

Example: f467d3b6-63ea-3eb4-896f-a9c97ff6f92a

GET api/v1/sa/c/{company_slug}/automation-events

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-events" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-events"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-events',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-events'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/automation-events

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

GET api/v1/sa/c/{company_slug}/automation-events/{automationEvent_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-events/02ccea26-141c-4f51-9aea-470b69cea45c" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-events/02ccea26-141c-4f51-9aea-470b69cea45c"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-events/02ccea26-141c-4f51-9aea-470b69cea45c',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-events/02ccea26-141c-4f51-9aea-470b69cea45c'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/automation-events/{automationEvent_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationEvent_uuid   string   

Example: 02ccea26-141c-4f51-9aea-470b69cea45c

POST api/v1/sa/c/{company_slug}/automation-events/manual

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-events/manual" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"emergency_stow\",
    \"payload\": {
        \"reason\": \"high_wind\",
        \"speed\": 75
    },
    \"collectorUuid\": \"550e8400-e29b-41d4-a716-446655440001\",
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440002\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-events/manual"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "emergency_stow",
    "payload": {
        "reason": "high_wind",
        "speed": 75
    },
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440001",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440002"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-events/manual',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'emergency_stow',
            'payload' => [
                'reason' => 'high_wind',
                'speed' => 75,
            ],
            'collectorUuid' => '550e8400-e29b-41d4-a716-446655440001',
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440002',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-events/manual'
payload = {
    "name": "emergency_stow",
    "payload": {
        "reason": "high_wind",
        "speed": 75
    },
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440001",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440002"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/automation-events/manual

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

name   string   

The name of the manual event to fire. Must not be greater than 255 characters. Example: emergency_stow

payload   object  optional  

Optional payload data for the event.

collectorUuid   string  optional  

Optional collector UUID to scope the event. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440001

farmUuid   string  optional  

Optional farm UUID to scope the event. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440002

GET api/v1/sa/c/{company_slug}/automation-executions

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-executions" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-executions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-executions',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-executions'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/automation-executions

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

GET api/v1/sa/c/{company_slug}/automation-executions/{automationExecution_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-executions/31e0f72f-9c0b-3245-8bb1-c802bfc06535" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-executions/31e0f72f-9c0b-3245-8bb1-c802bfc06535"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-executions/31e0f72f-9c0b-3245-8bb1-c802bfc06535',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation-executions/31e0f72f-9c0b-3245-8bb1-c802bfc06535'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/automation-executions/{automationExecution_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationExecution_uuid   string   

Example: 31e0f72f-9c0b-3245-8bb1-c802bfc06535

POST api/v1/sa/c/{company_slug}/automation/test/fire-event

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/fire-event" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"manual_stow_triggered\",
    \"payload\": {
        \"reason\": \"high_wind\",
        \"windSpeed\": 21.6
    },
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440040\",
    \"collectorUuid\": \"550e8400-e29b-41d4-a716-446655440041\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/fire-event"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "manual_stow_triggered",
    "payload": {
        "reason": "high_wind",
        "windSpeed": 21.6
    },
    "farmUuid": "550e8400-e29b-41d4-a716-446655440040",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440041"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/fire-event',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'manual_stow_triggered',
            'payload' => [
                'reason' => 'high_wind',
                'windSpeed' => 21.6,
            ],
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440040',
            'collectorUuid' => '550e8400-e29b-41d4-a716-446655440041',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/fire-event'
payload = {
    "name": "manual_stow_triggered",
    "payload": {
        "reason": "high_wind",
        "windSpeed": 21.6
    },
    "farmUuid": "550e8400-e29b-41d4-a716-446655440040",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440041"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/automation/test/fire-event

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

name   string   

Automation event name to fire. Must not be greater than 255 characters. Example: manual_stow_triggered

payload   object  optional  

Optional payload delivered with the event.

farmUuid   string  optional  

Optional farm UUID to scope the event. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440040

collectorUuid   string  optional  

Optional collector UUID to scope the event. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440041

POST api/v1/sa/c/{company_slug}/automation/test/dry-run-match

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/dry-run-match" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"ruleUuid\": \"550e8400-e29b-41d4-a716-446655440030\",
    \"eventPayload\": {
        \"eventName\": \"wind_alert\",
        \"speed\": 72.4,
        \"unit\": \"kmh\"
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/dry-run-match"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "ruleUuid": "550e8400-e29b-41d4-a716-446655440030",
    "eventPayload": {
        "eventName": "wind_alert",
        "speed": 72.4,
        "unit": "kmh"
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/dry-run-match',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'ruleUuid' => '550e8400-e29b-41d4-a716-446655440030',
            'eventPayload' => [
                'eventName' => 'wind_alert',
                'speed' => 72.4,
                'unit' => 'kmh',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/dry-run-match'
payload = {
    "ruleUuid": "550e8400-e29b-41d4-a716-446655440030",
    "eventPayload": {
        "eventName": "wind_alert",
        "speed": 72.4,
        "unit": "kmh"
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/automation/test/dry-run-match

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

ruleUuid   string   

UUID of the automation rule to evaluate. Must be a valid UUID. The uuid of an existing record in the automation_rules table. Example: 550e8400-e29b-41d4-a716-446655440030

eventPayload   object   

Event payload to run against rule conditions without executing actions.

POST api/v1/sa/c/{company_slug}/automation/test/preview-template

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/preview-template" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"template\": \"Alert: {{ collector.name }} exceeded {{ threshold }}.\",
    \"context\": {
        \"collector\": {
            \"name\": \"NCU-12\"
        },
        \"threshold\": 85
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/preview-template"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "template": "Alert: {{ collector.name }} exceeded {{ threshold }}.",
    "context": {
        "collector": {
            "name": "NCU-12"
        },
        "threshold": 85
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/preview-template',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'template' => 'Alert: {{ collector.name }} exceeded {{ threshold }}.',
            'context' => [
                'collector' => [
                    'name' => 'NCU-12',
                ],
                'threshold' => 85,
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/preview-template'
payload = {
    "template": "Alert: {{ collector.name }} exceeded {{ threshold }}.",
    "context": {
        "collector": {
            "name": "NCU-12"
        },
        "threshold": 85
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/automation/test/preview-template

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

template   string   

Template string to preview. Example: Alert: {{ collector.name }} exceeded {{ threshold }}.

context   object   

Template context data used for placeholder replacement.

POST api/v1/sa/c/{company_slug}/automation/test/send-notification

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/send-notification" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"notificationPolicyUuid\": \"550e8400-e29b-41d4-a716-446655440050\",
    \"recipientEmail\": \"alerts@example.com\",
    \"context\": {
        \"collectorName\": \"NCU-5\",
        \"alarm\": \"overheat\"
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/send-notification"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "notificationPolicyUuid": "550e8400-e29b-41d4-a716-446655440050",
    "recipientEmail": "alerts@example.com",
    "context": {
        "collectorName": "NCU-5",
        "alarm": "overheat"
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/send-notification',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'notificationPolicyUuid' => '550e8400-e29b-41d4-a716-446655440050',
            'recipientEmail' => 'alerts@example.com',
            'context' => [
                'collectorName' => 'NCU-5',
                'alarm' => 'overheat',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/send-notification'
payload = {
    "notificationPolicyUuid": "550e8400-e29b-41d4-a716-446655440050",
    "recipientEmail": "alerts@example.com",
    "context": {
        "collectorName": "NCU-5",
        "alarm": "overheat"
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/automation/test/send-notification

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

notificationPolicyUuid   string   

UUID of the notification policy used for this test send. Must be a valid UUID. The uuid of an existing record in the notification_policies table. Example: 550e8400-e29b-41d4-a716-446655440050

recipientEmail   string   

Recipient email address for the test notification. Must be a valid email address. Example: alerts@example.com

context   object  optional  

Optional context payload rendered in the notification template.

GET api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

POST api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"weather-station-test-endpoint\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "weather-station-test-endpoint"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'weather-station-test-endpoint',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints'
payload = {
    "name": "weather-station-test-endpoint"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

name   string   

Unique endpoint name within the company. Must not be greater than 255 characters. Example: weather-station-test-endpoint

GET api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/b08e44f2-9bb2-38f6-82cb-663878dc1782" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/b08e44f2-9bb2-38f6-82cb-663878dc1782"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/b08e44f2-9bb2-38f6-82cb-663878dc1782',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/b08e44f2-9bb2-38f6-82cb-663878dc1782'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: b08e44f2-9bb2-38f6-82cb-663878dc1782

PUT api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/26ab52fd-9e52-3207-875c-c4e4e7d4d54d" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/26ab52fd-9e52-3207-875c-c4e4e7d4d54d"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "enabled": true
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/26ab52fd-9e52-3207-875c-c4e4e7d4d54d',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/26ab52fd-9e52-3207-875c-c4e4e7d4d54d'
payload = {
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

PATCH api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: 26ab52fd-9e52-3207-875c-c4e4e7d4d54d

Body Parameters

enabled   boolean   

Whether this test webhook endpoint is enabled. Example: true

POST api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/rotate

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/efd2d379-3e27-3497-acb9-530dc08d9e3b/rotate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/efd2d379-3e27-3497-acb9-530dc08d9e3b/rotate"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/efd2d379-3e27-3497-acb9-530dc08d9e3b/rotate',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/efd2d379-3e27-3497-acb9-530dc08d9e3b/rotate'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/rotate

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: efd2d379-3e27-3497-acb9-530dc08d9e3b

DELETE api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/3ba1c96f-c0b4-3ff5-8482-a0786b4b429a" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/3ba1c96f-c0b4-3ff5-8482-a0786b4b429a"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/3ba1c96f-c0b4-3ff5-8482-a0786b4b429a',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/3ba1c96f-c0b4-3ff5-8482-a0786b4b429a'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: 3ba1c96f-c0b4-3ff5-8482-a0786b4b429a

GET api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/events

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/9523d35d-71d3-35e6-89dd-6e87c1e440dc/events?perPage=25&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/9523d35d-71d3-35e6-89dd-6e87c1e440dc/events"
);

const params = {
    "perPage": "25",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/9523d35d-71d3-35e6-89dd-6e87c1e440dc/events',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'perPage' => '25',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/9523d35d-71d3-35e6-89dd-6e87c1e440dc/events'
params = {
  'perPage': '25',
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/events

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: 9523d35d-71d3-35e6-89dd-6e87c1e440dc

Query Parameters

perPage   integer  optional  

Number of events to return per page. Must be at least 1. Must not be greater than 100. Example: 25

page   integer  optional  

Pagination page number. Must be at least 1. Example: 1

GET api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/events/latest

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/c9494408-88bf-340b-a9d0-d71145e7f42e/events/latest" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/c9494408-88bf-340b-a9d0-d71145e7f42e/events/latest"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/c9494408-88bf-340b-a9d0-d71145e7f42e/events/latest',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/c9494408-88bf-340b-a9d0-d71145e7f42e/events/latest'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/events/latest

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: c9494408-88bf-340b-a9d0-d71145e7f42e

DELETE api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/events

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/d5598939-cab2-3cea-b945-9f2f155c115f/events" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/d5598939-cab2-3cea-b945-9f2f155c115f/events"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/d5598939-cab2-3cea-b945-9f2f155c115f/events',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-endpoints/d5598939-cab2-3cea-b945-9f2f155c115f/events'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/events

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEndpoint_uuid   string   

Example: d5598939-cab2-3cea-b945-9f2f155c115f

GET api/v1/sa/c/{company_slug}/automation/test/webhook-events/{automationTestWebhookEvent_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-events/396228d8-5c65-3b7b-8655-6c8e2c49392f" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-events/396228d8-5c65-3b7b-8655-6c8e2c49392f"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-events/396228d8-5c65-3b7b-8655-6c8e2c49392f',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-events/396228d8-5c65-3b7b-8655-6c8e2c49392f'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/automation/test/webhook-events/{automationTestWebhookEvent_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEvent_uuid   string   

Example: 396228d8-5c65-3b7b-8655-6c8e2c49392f

DELETE api/v1/sa/c/{company_slug}/automation/test/webhook-events/{automationTestWebhookEvent_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-events/d797fbcb-0fa1-3288-b79d-d462d56c833e" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-events/d797fbcb-0fa1-3288-b79d-d462d56c833e"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-events/d797fbcb-0fa1-3288-b79d-d462d56c833e',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-events/d797fbcb-0fa1-3288-b79d-d462d56c833e'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}/automation/test/webhook-events/{automationTestWebhookEvent_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

automationTestWebhookEvent_uuid   string   

Example: d797fbcb-0fa1-3288-b79d-d462d56c833e

POST api/v1/sa/c/{company_slug}/automation/test/webhook-inbox/setup

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-inbox/setup" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Automation Test Inbox\",
    \"resetEvents\": false,
    \"rotateSecret\": true,
    \"notificationChannelUuid\": \"550e8400-e29b-41d4-a716-446655440010\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-inbox/setup"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Automation Test Inbox",
    "resetEvents": false,
    "rotateSecret": true,
    "notificationChannelUuid": "550e8400-e29b-41d4-a716-446655440010"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-inbox/setup',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Automation Test Inbox',
            'resetEvents' => false,
            'rotateSecret' => true,
            'notificationChannelUuid' => '550e8400-e29b-41d4-a716-446655440010',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/automation/test/webhook-inbox/setup'
payload = {
    "name": "Automation Test Inbox",
    "resetEvents": false,
    "rotateSecret": true,
    "notificationChannelUuid": "550e8400-e29b-41d4-a716-446655440010"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/automation/test/webhook-inbox/setup

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

name   string  optional  

Optional display name for the webhook inbox endpoint. Must not be greater than 255 characters. Example: Automation Test Inbox

resetEvents   boolean  optional  

Whether to clear existing captured webhook events before setup. Example: false

rotateSecret   boolean  optional  

Whether to rotate the endpoint secret during setup. Example: true

notificationChannelUuid   string  optional  

Optional notification channel UUID to connect with this inbox. Must be a valid UUID. The uuid of an existing record in the notification_channels table. Example: 550e8400-e29b-41d4-a716-446655440010

GET api/v1/sa/collectors

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/collectors" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/collectors',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/collectors

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

POST api/v1/sa/collectors

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/collectors" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"NCU-001\",
    \"description\": \"Main control unit for section A\",
    \"collectorTypeSlug\": \"ncu\",
    \"farmSectionUuid\": \"550e8400-e29b-41d4-a716-446655440123\",
    \"serial\": \"NCU-2025-001234\",
    \"enabled\": true,
    \"locationJson\": {
        \"latitude\": -33.8688,
        \"longitude\": 151.2093
    },
    \"parentUuid\": \"550e8400-e29b-41d4-a716-446655440001\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "NCU-001",
    "description": "Main control unit for section A",
    "collectorTypeSlug": "ncu",
    "farmSectionUuid": "550e8400-e29b-41d4-a716-446655440123",
    "serial": "NCU-2025-001234",
    "enabled": true,
    "locationJson": {
        "latitude": -33.8688,
        "longitude": 151.2093
    },
    "parentUuid": "550e8400-e29b-41d4-a716-446655440001"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/collectors',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'NCU-001',
            'description' => 'Main control unit for section A',
            'collectorTypeSlug' => 'ncu',
            'farmSectionUuid' => '550e8400-e29b-41d4-a716-446655440123',
            'serial' => 'NCU-2025-001234',
            'enabled' => true,
            'locationJson' => [
                'latitude' => -33.8688,
                'longitude' => 151.2093,
            ],
            'parentUuid' => '550e8400-e29b-41d4-a716-446655440001',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors'
payload = {
    "name": "NCU-001",
    "description": "Main control unit for section A",
    "collectorTypeSlug": "ncu",
    "farmSectionUuid": "550e8400-e29b-41d4-a716-446655440123",
    "serial": "NCU-2025-001234",
    "enabled": true,
    "locationJson": {
        "latitude": -33.8688,
        "longitude": 151.2093
    },
    "parentUuid": "550e8400-e29b-41d4-a716-446655440001"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/collectors

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

name   string   

Collector name. Must not be greater than 255 characters. Example: NCU-001

description   string  optional  

Collector description. Must not be greater than 255 characters. Example: Main control unit for section A

collectorTypeSlug   string   

Collector type identifier (slug). Allowed: ncu, tcu. Example: ncu

farmSectionUuid   string   

UUID of the farm section (required, determines farm and company). Must be a valid UUID. The uuid of an existing record in the farm_sections table. Example: 550e8400-e29b-41d4-a716-446655440123

serial   string   

Unique serial number. Must not be greater than 255 characters. Example: NCU-2025-001234

enabled   boolean  optional  

Whether the collector is enabled. Example: true

locationJson   object  optional  

Geographic location.

latitude   number  optional  

This field is required when locationJson is present. Must be between -90 and 90. Example: -33.8688

longitude   number  optional  

This field is required when locationJson is present. Must be between -180 and 180. Example: 151.2093

parentUuid   string  optional  

UUID of the parent NCU (required for TCU, must belong to same company). Must be a valid UUID. The uuid of an existing record in the collectors table. Example: 550e8400-e29b-41d4-a716-446655440001

GET api/v1/sa/collectors/summary

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/collectors/summary" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/summary"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/collectors/summary',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/summary'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/collectors/summary

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

POST api/v1/sa/collectors/register

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/collectors/register" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"serial\": \"NCU-2025-001234\",
    \"deviceModelTypeSlug\": \"ncu-x100-001\",
    \"hardwareVersionTypeSlug\": \"v1-0-0\",
    \"manufacturedAt\": \"2025-01-15\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/register"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "serial": "NCU-2025-001234",
    "deviceModelTypeSlug": "ncu-x100-001",
    "hardwareVersionTypeSlug": "v1-0-0",
    "manufacturedAt": "2025-01-15"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/collectors/register',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'serial' => 'NCU-2025-001234',
            'deviceModelTypeSlug' => 'ncu-x100-001',
            'hardwareVersionTypeSlug' => 'v1-0-0',
            'manufacturedAt' => '2025-01-15',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/register'
payload = {
    "serial": "NCU-2025-001234",
    "deviceModelTypeSlug": "ncu-x100-001",
    "hardwareVersionTypeSlug": "v1-0-0",
    "manufacturedAt": "2025-01-15"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/collectors/register

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

serial   string   

Unique serial number for the collector. Must not be greater than 255 characters. Example: NCU-2025-001234

deviceModelTypeSlug   string   

Device model type slug. The slug of an existing record in the device_model_types table. Example: ncu-x100-001

hardwareVersionTypeSlug   string  optional  

Hardware version type slug (optional). The slug of an existing record in the hardware_version_types table. Example: v1-0-0

manufacturedAt   string  optional  

Manufacture date (optional). Must be a valid date. Example: 2025-01-15

POST api/v1/sa/collectors/bulk-register

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/collectors/bulk-register" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"devices\": [
        {
            \"serial\": \"NCU-2025-001234\",
            \"deviceModelTypeSlug\": \"ncu-x100-001\",
            \"hardwareVersionTypeSlug\": \"v1-0-0\",
            \"manufacturedAt\": \"2025-01-15\"
        }
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/bulk-register"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "devices": [
        {
            "serial": "NCU-2025-001234",
            "deviceModelTypeSlug": "ncu-x100-001",
            "hardwareVersionTypeSlug": "v1-0-0",
            "manufacturedAt": "2025-01-15"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/collectors/bulk-register',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'devices' => [
                [
                    'serial' => 'NCU-2025-001234',
                    'deviceModelTypeSlug' => 'ncu-x100-001',
                    'hardwareVersionTypeSlug' => 'v1-0-0',
                    'manufacturedAt' => '2025-01-15',
                ],
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/bulk-register'
payload = {
    "devices": [
        {
            "serial": "NCU-2025-001234",
            "deviceModelTypeSlug": "ncu-x100-001",
            "hardwareVersionTypeSlug": "v1-0-0",
            "manufacturedAt": "2025-01-15"
        }
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/collectors/bulk-register

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

devices   object[]   

Array of devices to register (max 500). Must have at least 1 items. Must not have more than 500 items.

serial   string   

Must not be greater than 255 characters. Example: fjfzfdbrxw

deviceModelTypeSlug   string   

The slug of an existing record in the device_model_types table. Example: itaque

hardwareVersionTypeSlug   string  optional  

The slug of an existing record in the hardware_version_types table. Example: beatae

manufacturedAt   string  optional  

Must be a valid date. Example: 2026-03-26T23:05:09

GET api/v1/sa/collectors/{uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/collectors/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

PATCH api/v1/sa/collectors/{uuid}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"NCU-001 Updated\",
    \"description\": \"Updated control unit for section A\",
    \"collectorTypeSlug\": \"tcu\",
    \"farmSectionUuid\": \"550e8400-e29b-41d4-a716-446655440123\",
    \"serial\": \"NCU-2025-001234\",
    \"enabled\": true,
    \"locationJson\": {
        \"latitude\": -33.8688,
        \"longitude\": 151.2093
    },
    \"parentUuid\": \"550e8400-e29b-41d4-a716-446655440001\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "NCU-001 Updated",
    "description": "Updated control unit for section A",
    "collectorTypeSlug": "tcu",
    "farmSectionUuid": "550e8400-e29b-41d4-a716-446655440123",
    "serial": "NCU-2025-001234",
    "enabled": true,
    "locationJson": {
        "latitude": -33.8688,
        "longitude": 151.2093
    },
    "parentUuid": "550e8400-e29b-41d4-a716-446655440001"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'NCU-001 Updated',
            'description' => 'Updated control unit for section A',
            'collectorTypeSlug' => 'tcu',
            'farmSectionUuid' => '550e8400-e29b-41d4-a716-446655440123',
            'serial' => 'NCU-2025-001234',
            'enabled' => true,
            'locationJson' => [
                'latitude' => -33.8688,
                'longitude' => 151.2093,
            ],
            'parentUuid' => '550e8400-e29b-41d4-a716-446655440001',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa'
payload = {
    "name": "NCU-001 Updated",
    "description": "Updated control unit for section A",
    "collectorTypeSlug": "tcu",
    "farmSectionUuid": "550e8400-e29b-41d4-a716-446655440123",
    "serial": "NCU-2025-001234",
    "enabled": true,
    "locationJson": {
        "latitude": -33.8688,
        "longitude": 151.2093
    },
    "parentUuid": "550e8400-e29b-41d4-a716-446655440001"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/collectors/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

Body Parameters

name   string   

Collector name. Must not be greater than 255 characters. Example: NCU-001 Updated

description   string  optional  

Collector description. Must not be greater than 255 characters. Example: Updated control unit for section A

collectorTypeSlug   string   

Collector type identifier (slug). Allowed: ncu, tcu. Example: tcu

farmSectionUuid   string   

UUID of the farm section (required, determines farm and company). Must be a valid UUID. The uuid of an existing record in the farm_sections table. Example: 550e8400-e29b-41d4-a716-446655440123

serial   string   

Unique serial number. Must not be greater than 255 characters. Example: NCU-2025-001234

enabled   boolean  optional  

Whether the collector is enabled. Example: true

locationJson   object  optional  

Geographic location.

latitude   number  optional  

This field is required when locationJson is present. Must be between -90 and 90. Example: -33.8688

longitude   number  optional  

This field is required when locationJson is present. Must be between -180 and 180. Example: 151.2093

parentUuid   string  optional  

UUID of the parent collector. Must be a valid UUID. The uuid of an existing record in the collectors table. Example: 550e8400-e29b-41d4-a716-446655440001

DELETE api/v1/sa/collectors/{uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/collectors/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

GET api/v1/sa/collectors/{collector_uuid}/status-history

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/status-history" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/status-history"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/status-history',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/status-history'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/collectors/{collector_uuid}/status-history

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

PATCH api/v1/sa/collectors/{collector_uuid}/status

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/status" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"status\": \"testing\",
    \"reason\": \"Moving to testing phase after QA review\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/status"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "status": "testing",
    "reason": "Moving to testing phase after QA review"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'status' => 'testing',
            'reason' => 'Moving to testing phase after QA review',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/status'
payload = {
    "status": "testing",
    "reason": "Moving to testing phase after QA review"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/collectors/{collector_uuid}/status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

Body Parameters

status   string   

Target status slug to transition to. The slug of an existing record in the collector_status_types table. Example: testing

reason   string  optional  

Optional reason for the status transition. Must not be greater than 1000 characters. Example: Moving to testing phase after QA review

GET api/v1/sa/collectors/{collector_uuid}/timeline

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/timeline" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/timeline"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/timeline',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/timeline'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/collectors/{collector_uuid}/timeline

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

PUT api/v1/sa/collectors/{collector_uuid}/transfer

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/transfer" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"targetCompanySlug\": \"acme-solar\",
    \"reason\": \"Customer contract change\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/transfer"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "targetCompanySlug": "acme-solar",
    "reason": "Customer contract change"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/transfer',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'targetCompanySlug' => 'acme-solar',
            'reason' => 'Customer contract change',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/transfer'
payload = {
    "targetCompanySlug": "acme-solar",
    "reason": "Customer contract change"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/sa/collectors/{collector_uuid}/transfer

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

Body Parameters

targetCompanySlug   string   

Slug of the target company to transfer the collector to. The slug of an existing record in the companies table. Example: acme-solar

reason   string  optional  

Reason for the transfer. Must not be greater than 2000 characters. Example: Customer contract change

GET api/v1/sa/unassigned-collectors

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/unassigned-collectors" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/unassigned-collectors"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/unassigned-collectors',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/unassigned-collectors'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/unassigned-collectors

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

POST api/v1/sa/collectors/{collector_uuid}/assign

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/assign" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"parentCollectorUuid\": \"550e8400-e29b-41d4-a716-446655440321\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/assign"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "parentCollectorUuid": "550e8400-e29b-41d4-a716-446655440321"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/assign',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'parentCollectorUuid' => '550e8400-e29b-41d4-a716-446655440321',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/assign'
payload = {
    "parentCollectorUuid": "550e8400-e29b-41d4-a716-446655440321"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/collectors/{collector_uuid}/assign

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

Body Parameters

parentCollectorUuid   string   

UUID of the parent collector to assign. Must be a valid UUID. The uuid of an existing record in the collectors table. Example: 550e8400-e29b-41d4-a716-446655440321

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/unlink" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/unlink"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/unlink',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/unlink'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

PATCH api/v1/sa/collectors/{collector_uuid}/change-type

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/change-type" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"collectorTypeSlug\": \"tcu\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/change-type"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "collectorTypeSlug": "tcu"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/change-type',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'collectorTypeSlug' => 'tcu',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/change-type'
payload = {
    "collectorTypeSlug": "tcu"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/collectors/{collector_uuid}/change-type

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

Body Parameters

collectorTypeSlug   string   

Collector type slug to assign. The slug of an existing record in the collector_types table. Example: tcu

Assign a warranty to a collector.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/warranty" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"warrantyTypeSlug\": \"standard-two-year\",
    \"warrantyStart\": \"2026-02-17\",
    \"warrantyEnd\": \"2028-02-17\",
    \"notes\": \"Coverage includes actuator and controller board.\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/warranty"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "warrantyTypeSlug": "standard-two-year",
    "warrantyStart": "2026-02-17",
    "warrantyEnd": "2028-02-17",
    "notes": "Coverage includes actuator and controller board."
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/warranty',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'warrantyTypeSlug' => 'standard-two-year',
            'warrantyStart' => '2026-02-17',
            'warrantyEnd' => '2028-02-17',
            'notes' => 'Coverage includes actuator and controller board.',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collectors/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/warranty'
payload = {
    "warrantyTypeSlug": "standard-two-year",
    "warrantyStart": "2026-02-17",
    "warrantyEnd": "2028-02-17",
    "notes": "Coverage includes actuator and controller board."
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/collectors/{collector_uuid}/warranty

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

Body Parameters

warrantyTypeSlug   string   

Warranty type slug to assign. The slug of an existing record in the warranty_types table. Example: standard-two-year

warrantyStart   string   

Warranty start date. Must be a valid date. Example: 2026-02-17

warrantyEnd   string  optional  

Optional warranty end date. Must be after warrantyStart. Must be a valid date. Must be a date after warrantyStart. Example: 2028-02-17

notes   string  optional  

Optional notes associated with this warranty assignment. Must not be greater than 2000 characters. Example: Coverage includes actuator and controller board.

GET api/v1/sa/farms

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/farms" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/farms',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/farms

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

POST api/v1/sa/farms

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/farms" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Solar Farm Alpha\",
    \"description\": \"Main solar installation in the northern region\",
    \"companySlug\": \"solar-energy-corp\",
    \"locationJson\": {
        \"latitude\": -33.8688,
        \"longitude\": 151.2093
    },
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Solar Farm Alpha",
    "description": "Main solar installation in the northern region",
    "companySlug": "solar-energy-corp",
    "locationJson": {
        "latitude": -33.8688,
        "longitude": 151.2093
    },
    "enabled": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/farms',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Solar Farm Alpha',
            'description' => 'Main solar installation in the northern region',
            'companySlug' => 'solar-energy-corp',
            'locationJson' => [
                'latitude' => -33.8688,
                'longitude' => 151.2093,
            ],
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms'
payload = {
    "name": "Solar Farm Alpha",
    "description": "Main solar installation in the northern region",
    "companySlug": "solar-energy-corp",
    "locationJson": {
        "latitude": -33.8688,
        "longitude": 151.2093
    },
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/farms

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

name   string   

Farm name. Must not be greater than 255 characters. Example: Solar Farm Alpha

description   string  optional  

Farm description. Must not be greater than 255 characters. Example: Main solar installation in the northern region

companySlug   string   

Company identifier (slug). The slug of an existing record in the companies table. Example: solar-energy-corp

locationJson   object   

Geographic location with latitude and longitude.

latitude   number   

Must be between -90 and 90. Example: -33.8688

longitude   number   

Must be between -180 and 180. Example: 151.2093

enabled   boolean  optional  

Whether the farm is enabled. Example: true

GET api/v1/sa/farms/{uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/farms/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

PATCH api/v1/sa/farms/{uuid}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Solar Farm Alpha Updated\",
    \"description\": \"Updated solar installation details\",
    \"locationJson\": {
        \"latitude\": -33.8688,
        \"longitude\": 151.2093
    },
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Solar Farm Alpha Updated",
    "description": "Updated solar installation details",
    "locationJson": {
        "latitude": -33.8688,
        "longitude": 151.2093
    },
    "enabled": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Solar Farm Alpha Updated',
            'description' => 'Updated solar installation details',
            'locationJson' => [
                'latitude' => -33.8688,
                'longitude' => 151.2093,
            ],
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b'
payload = {
    "name": "Solar Farm Alpha Updated",
    "description": "Updated solar installation details",
    "locationJson": {
        "latitude": -33.8688,
        "longitude": 151.2093
    },
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/farms/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

Body Parameters

name   string   

Farm name. Must not be greater than 255 characters. Example: Solar Farm Alpha Updated

description   string  optional  

Farm description. Must not be greater than 255 characters. Example: Updated solar installation details

companySlug   string  optional  
locationJson   object  optional  

Geographic location with latitude and longitude.

latitude   number  optional  

This field is required when locationJson is present. Must be between -90 and 90. Example: -33.8688

longitude   number  optional  

This field is required when locationJson is present. Must be between -180 and 180. Example: 151.2093

enabled   boolean  optional  

Whether the farm is enabled. Example: true

DELETE api/v1/sa/farms/{uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/farms/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

Bulk assign collectors to a farm

requires authentication

Assign multiple collectors to a farm in a single request. Collectors must belong to the same company as the farm.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/collectors/bulk-assign" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"collectorUuids\": [
        \"550e8400-e29b-41d4-a716-446655440001\",
        \"550e8400-e29b-41d4-a716-446655440002\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/collectors/bulk-assign"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "collectorUuids": [
        "550e8400-e29b-41d4-a716-446655440001",
        "550e8400-e29b-41d4-a716-446655440002"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/collectors/bulk-assign',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'collectorUuids' => [
                '550e8400-e29b-41d4-a716-446655440001',
                '550e8400-e29b-41d4-a716-446655440002',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/collectors/bulk-assign'
payload = {
    "collectorUuids": [
        "550e8400-e29b-41d4-a716-446655440001",
        "550e8400-e29b-41d4-a716-446655440002"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
  "success": true,
  "message": "Assigned 5 collector(s) to farm",
  "data": {
    "assigned": 5,
    "skipped": 2,
    "collectors": [...]
  }
}
 

Request      

POST api/v1/sa/farms/{farm_uuid}/collectors/bulk-assign

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

farm   string   

The UUID of the farm. Example: 550e8400-e29b-41d4-a716-446655440000

Body Parameters

collectorUuids   string[]   

List of collector UUIDs to assign.

List sections for a farm

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections?enabled_only=1&page=1&perPage=25" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections"
);

const params = {
    "enabled_only": "1",
    "page": "1",
    "perPage": "25",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'enabled_only' => '1',
            'page' => '1',
            'perPage' => '25',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections'
params = {
  'enabled_only': '1',
  'page': '1',
  'perPage': '25',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "data": [
        {
            "uuid": "147594ba-6f75-4b06-9daf-4c9dc58b34c1",
            "name": "Unassigned",
            "description": "",
            "enabled": true,
            "orderColumn": 0,
            "location": null,
            "locationJson": null,
            "metadata": null,
            "createdAt": "2026-01-14T19:48:46+00:00",
            "updatedAt": "2026-01-16T10:41:36+00:00",
            "isUnassigned": true
        },
        {
            "uuid": "147594ba-6f75-4b06-9daf-4c9dc58b34c1",
            "name": "Unassigned",
            "description": "",
            "enabled": true,
            "orderColumn": 0,
            "location": null,
            "locationJson": null,
            "metadata": null,
            "createdAt": "2026-01-14T19:48:46+00:00",
            "updatedAt": "2026-01-16T10:41:36+00:00",
            "isUnassigned": true
        }
    ]
}
 

Request      

GET api/v1/sa/farms/{farm_uuid}/sections

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

farm   string   

The UUID of the farm Example: est

Query Parameters

enabled_only   boolean  optional  

Filter to only enabled sections. Example: true

page   integer  optional  

Page number. Example: 1

perPage   integer  optional  

Results per page (max 100). Example: 25

Create a new farm section

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"North Field\",
    \"description\": \"Northern section of the farm\",
    \"enabled\": true,
    \"orderColumn\": 1,
    \"locationJson\": {
        \"latitude\": 51.509865,
        \"longitude\": -0.118092
    },
    \"metadata\": {
        \"notes\": \"Primary section\"
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "North Field",
    "description": "Northern section of the farm",
    "enabled": true,
    "orderColumn": 1,
    "locationJson": {
        "latitude": 51.509865,
        "longitude": -0.118092
    },
    "metadata": {
        "notes": "Primary section"
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'North Field',
            'description' => 'Northern section of the farm',
            'enabled' => true,
            'orderColumn' => 1,
            'locationJson' => [
                'latitude' => 51.509865,
                'longitude' => -0.118092,
            ],
            'metadata' => [
                'notes' => 'Primary section',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/sections'
payload = {
    "name": "North Field",
    "description": "Northern section of the farm",
    "enabled": true,
    "orderColumn": 1,
    "locationJson": {
        "latitude": 51.509865,
        "longitude": -0.118092
    },
    "metadata": {
        "notes": "Primary section"
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "147594ba-6f75-4b06-9daf-4c9dc58b34c1",
        "name": "Unassigned",
        "description": "",
        "enabled": true,
        "orderColumn": 0,
        "location": null,
        "locationJson": null,
        "metadata": null,
        "createdAt": "2026-01-14T19:48:46+00:00",
        "updatedAt": "2026-01-16T10:41:36+00:00",
        "isUnassigned": true
    }
}
 

Request      

POST api/v1/sa/farms/{farm_uuid}/sections

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

farm   string   

The UUID of the farm Example: nemo

Body Parameters

name   string   

The name of the section. Example: North Field

slug   string  optional  
description   string  optional  

The description. Example: Northern section of the farm

enabled   boolean  optional  

Whether section is enabled. Example: true

orderColumn   integer  optional  

Display order. Example: 1

locationJson   object  optional  

Location coordinates.

latitude   number  optional  

This field is required when locationJson is present. Must be between -90 and 90. Example: 51.509865

longitude   number  optional  

This field is required when locationJson is present. Must be between -180 and 180. Example: -0.118092

metadata   object  optional  

Optional metadata.

Show a farm section

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "uuid": "147594ba-6f75-4b06-9daf-4c9dc58b34c1",
        "name": "Unassigned",
        "description": "",
        "enabled": true,
        "orderColumn": 0,
        "location": null,
        "locationJson": null,
        "metadata": null,
        "createdAt": "2026-01-14T19:48:46+00:00",
        "updatedAt": "2026-01-16T10:41:36+00:00",
        "isUnassigned": true
    }
}
 

Request      

GET api/v1/sa/farm-sections/{section_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 147594ba-6f75-4b06-9daf-4c9dc58b34c1

section   string   

The UUID of the section Example: voluptas

Update a farm section

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"North Field Updated\",
    \"description\": \"Updated description\",
    \"enabled\": false,
    \"orderColumn\": 2,
    \"locationJson\": {
        \"latitude\": 51.509865,
        \"longitude\": -0.118092
    },
    \"metadata\": {
        \"notes\": \"Updated notes\"
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "North Field Updated",
    "description": "Updated description",
    "enabled": false,
    "orderColumn": 2,
    "locationJson": {
        "latitude": 51.509865,
        "longitude": -0.118092
    },
    "metadata": {
        "notes": "Updated notes"
    }
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'North Field Updated',
            'description' => 'Updated description',
            'enabled' => false,
            'orderColumn' => 2,
            'locationJson' => [
                'latitude' => 51.509865,
                'longitude' => -0.118092,
            ],
            'metadata' => [
                'notes' => 'Updated notes',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1'
payload = {
    "name": "North Field Updated",
    "description": "Updated description",
    "enabled": false,
    "orderColumn": 2,
    "locationJson": {
        "latitude": 51.509865,
        "longitude": -0.118092
    },
    "metadata": {
        "notes": "Updated notes"
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "147594ba-6f75-4b06-9daf-4c9dc58b34c1",
        "name": "Unassigned",
        "description": "",
        "enabled": true,
        "orderColumn": 0,
        "location": null,
        "locationJson": null,
        "metadata": null,
        "createdAt": "2026-01-14T19:48:46+00:00",
        "updatedAt": "2026-01-16T10:41:36+00:00",
        "isUnassigned": true
    }
}
 

Request      

PATCH api/v1/sa/farm-sections/{section_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 147594ba-6f75-4b06-9daf-4c9dc58b34c1

section   string   

The UUID of the section Example: dolor

Body Parameters

name   string  optional  

The name of the section. Example: North Field Updated

slug   string  optional  
description   string  optional  

The description. Example: Updated description

enabled   boolean  optional  

Whether section is enabled. Example: false

orderColumn   integer  optional  

Display order. Example: 2

locationJson   object  optional  

Location coordinates.

latitude   number  optional  

This field is required when locationJson is present. Must be between -90 and 90. Example: 51.509865

longitude   number  optional  

This field is required when locationJson is present. Must be between -180 and 180. Example: -0.118092

metadata   object  optional  

Optional metadata.

Delete a farm section

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204):

[Empty response]
 

Request      

DELETE api/v1/sa/farm-sections/{section_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 147594ba-6f75-4b06-9daf-4c9dc58b34c1

section   string   

The UUID of the section Example: fuga

Bulk assign collectors to section

requires authentication

Assigns multiple collectors to a specific farm section. The farm is derived from the section automatically. Collectors already on this farm+section are skipped.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1/collectors/bulk-assign" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"collectorUuids\": [
        \"550e8400-e29b-41d4-a716-446655440001\",
        \"550e8400-e29b-41d4-a716-446655440002\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1/collectors/bulk-assign"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "collectorUuids": [
        "550e8400-e29b-41d4-a716-446655440001",
        "550e8400-e29b-41d4-a716-446655440002"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1/collectors/bulk-assign',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'collectorUuids' => [
                '550e8400-e29b-41d4-a716-446655440001',
                '550e8400-e29b-41d4-a716-446655440002',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farm-sections/147594ba-6f75-4b06-9daf-4c9dc58b34c1/collectors/bulk-assign'
payload = {
    "collectorUuids": [
        "550e8400-e29b-41d4-a716-446655440001",
        "550e8400-e29b-41d4-a716-446655440002"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{"data": {"assigned": 2, "skipped": 1, "collectors": [...]}}
 

Example response (404):


{
    "error": "Section not found"
}
 

Example response (422):


{
    "message": "Validation failed",
    "errors": {
        "collectorUuids": [
            "At least one collector UUID is required"
        ]
    }
}
 

Request      

POST api/v1/sa/farm-sections/{section_uuid}/collectors/bulk-assign

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 147594ba-6f75-4b06-9daf-4c9dc58b34c1

section   string   

The UUID of the farm section. Example: 550e8400-e29b-41d4-a716-446655440123

Body Parameters

collectorUuids   string[]   

List of collector UUIDs to assign.

List trackers for a farm

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers?sectionUuid=550e8400-e29b-41d4-a716-446655440001&isCurrent=1&placed=1&sectioned=1&perPage=50" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers"
);

const params = {
    "sectionUuid": "550e8400-e29b-41d4-a716-446655440001",
    "isCurrent": "1",
    "placed": "1",
    "sectioned": "1",
    "perPage": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'sectionUuid' => '550e8400-e29b-41d4-a716-446655440001',
            'isCurrent' => '1',
            'placed' => '1',
            'sectioned' => '1',
            'perPage' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers'
params = {
  'sectionUuid': '550e8400-e29b-41d4-a716-446655440001',
  'isCurrent': '1',
  'placed': '1',
  'sectioned': '1',
  'perPage': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "data": [
        {
            "uuid": "a205ee53-a5ce-4ecf-8103-d1ace6488432",
            "collectorUuid": "a5ed3d06-9ac9-4eaf-8ea3-c7ec9dcafe54",
            "collectorType": "TCU",
            "farmUuid": null,
            "farmSectionUuid": "9d97ca6c-31f2-45e3-a586-2656291af1eb",
            "row": 0,
            "column": 0,
            "widthM": "5.00",
            "heightM": "2.00",
            "angleDeg": "0.00",
            "location": null,
            "locationJson": null,
            "metadata": null,
            "isCurrent": false,
            "activeFrom": "2026-01-14T20:08:43+00:00",
            "activeTo": "2026-03-10T09:42:17+00:00",
            "createdAt": "2026-01-14T20:08:43+00:00",
            "updatedAt": "2026-03-10T09:42:17+00:00",
            "collector": {
                "uuid": "a5ed3d06-9ac9-4eaf-8ea3-c7ec9dcafe54",
                "collectorTypeSlug": "tcu",
                "serial": "9",
                "name": "Auto-created TCU Collector 9",
                "enabled": true
            },
            "farmSection": {
                "uuid": "9d97ca6c-31f2-45e3-a586-2656291af1eb",
                "name": "Section1",
                "description": "",
                "enabled": true,
                "orderColumn": 0,
                "location": {
                    "lat": -25.860111769169364,
                    "lng": 28.194855451583862
                },
                "locationJson": {
                    "latitude": -25.860111769169364,
                    "longitude": 28.194855451583862
                },
                "metadata": null,
                "createdAt": "2025-12-17T18:48:47+00:00",
                "updatedAt": "2026-02-08T10:22:07+00:00",
                "isUnassigned": false
            }
        },
        {
            "uuid": "a205ee53-a5ce-4ecf-8103-d1ace6488432",
            "collectorUuid": "a5ed3d06-9ac9-4eaf-8ea3-c7ec9dcafe54",
            "collectorType": "TCU",
            "farmUuid": null,
            "farmSectionUuid": "9d97ca6c-31f2-45e3-a586-2656291af1eb",
            "row": 0,
            "column": 0,
            "widthM": "5.00",
            "heightM": "2.00",
            "angleDeg": "0.00",
            "location": null,
            "locationJson": null,
            "metadata": null,
            "isCurrent": false,
            "activeFrom": "2026-01-14T20:08:43+00:00",
            "activeTo": "2026-03-10T09:42:17+00:00",
            "createdAt": "2026-01-14T20:08:43+00:00",
            "updatedAt": "2026-03-10T09:42:17+00:00",
            "collector": {
                "uuid": "a5ed3d06-9ac9-4eaf-8ea3-c7ec9dcafe54",
                "collectorTypeSlug": "tcu",
                "serial": "9",
                "name": "Auto-created TCU Collector 9",
                "enabled": true
            },
            "farmSection": {
                "uuid": "9d97ca6c-31f2-45e3-a586-2656291af1eb",
                "name": "Section1",
                "description": "",
                "enabled": true,
                "orderColumn": 0,
                "location": {
                    "lat": -25.860111769169364,
                    "lng": 28.194855451583862
                },
                "locationJson": {
                    "latitude": -25.860111769169364,
                    "longitude": 28.194855451583862
                },
                "metadata": null,
                "createdAt": "2025-12-17T18:48:47+00:00",
                "updatedAt": "2026-02-08T10:22:07+00:00",
                "isUnassigned": false
            }
        }
    ]
}
 

Request      

GET api/v1/sa/farms/{farm_uuid}/trackers

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

farm   string   

The UUID of the farm Example: minima

Query Parameters

sectionUuid   string  optional  

Filter by section UUID. Example: 550e8400-e29b-41d4-a716-446655440001

isCurrent   boolean  optional  

Filter by current status. Example: true

placed   boolean  optional  

Filter by placement status. Example: true

sectioned   boolean  optional  

Filter by section assignment. Example: true

perPage   integer  optional  

Results per page (max 200). Example: 50

Get tracker statistics for a farm

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/stats" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/stats"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/stats',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/stats'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "totalCurrent": 150,
    "totalHistoric": 45,
    "placed": 120,
    "unplaced": 30,
    "sectioned": 100,
    "unsectioned": 50,
    "placementPercentage": 80
}
 

Request      

GET api/v1/sa/farms/{farm_uuid}/trackers/stats

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

farm   string   

The UUID of the farm Example: doloremque

Get section statistics for a farm

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/section-stats" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/section-stats"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/section-stats',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/section-stats'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "sections": [
        {
            "uuid": "550e8400-e29b-41d4-a716-446655440001",
            "name": "North Field",
            "slug": "north-field",
            "enabled": true,
            "orderColumn": 1,
            "trackerCount": 50,
            "placedCount": 45,
            "unplacedCount": 5
        }
    ]
}
 

Request      

GET api/v1/sa/farms/{farm_uuid}/trackers/section-stats

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

farm   string   

The UUID of the farm Example: autem

Bulk update trackers

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/bulk-update" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"tracker_uuids\": [
        \"550e8400-e29b-41d4-a716-446655440001\"
    ],
    \"row\": 5,
    \"column\": 10,
    \"width_m\": \"6.0\",
    \"height_m\": \"2.5\",
    \"angle_deg\": \"15.0\",
    \"farm_section_uuid\": \"550e8400-e29b-41d4-a716-446655440002\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/bulk-update"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "tracker_uuids": [
        "550e8400-e29b-41d4-a716-446655440001"
    ],
    "row": 5,
    "column": 10,
    "width_m": "6.0",
    "height_m": "2.5",
    "angle_deg": "15.0",
    "farm_section_uuid": "550e8400-e29b-41d4-a716-446655440002"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/bulk-update',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'tracker_uuids' => [
                '550e8400-e29b-41d4-a716-446655440001',
            ],
            'row' => 5,
            'column' => 10,
            'width_m' => '6.0',
            'height_m' => '2.5',
            'angle_deg' => '15.0',
            'farm_section_uuid' => '550e8400-e29b-41d4-a716-446655440002',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/bulk-update'
payload = {
    "tracker_uuids": [
        "550e8400-e29b-41d4-a716-446655440001"
    ],
    "row": 5,
    "column": 10,
    "width_m": "6.0",
    "height_m": "2.5",
    "angle_deg": "15.0",
    "farm_section_uuid": "550e8400-e29b-41d4-a716-446655440002"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "success": true,
    "message": "Updated 10 trackers",
    "count": 10
}
 

Request      

POST api/v1/sa/farms/{farm_uuid}/trackers/bulk-update

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

farm   string   

The UUID of the farm Example: est

Body Parameters

tracker_uuids   string[]   

List of tracker UUIDs.

row   integer  optional  

Row position. Example: 5

column   integer  optional  

Column position. Example: 10

width_m   numeric  optional  

Width in meters. Example: 6.0

height_m   numeric  optional  

Height in meters. Example: 2.5

angle_deg   numeric  optional  

Angle in degrees. Example: 15.0

farm_section_uuid   string  optional  

Farm section UUID. Example: 550e8400-e29b-41d4-a716-446655440002

Auto-place trackers in a grid

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/auto-place" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"section_uuid\": \"550e8400-e29b-41d4-a716-446655440001\",
    \"tracker_uuids\": [
        \"550e8400-e29b-41d4-a716-446655440002\"
    ],
    \"start_row\": 1,
    \"start_column\": 1,
    \"gap_width_m\": \"1.0\",
    \"gap_height_m\": \"1.0\",
    \"columns_per_row\": 10,
    \"angle_deg\": \"0.0\",
    \"apply\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/auto-place"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "section_uuid": "550e8400-e29b-41d4-a716-446655440001",
    "tracker_uuids": [
        "550e8400-e29b-41d4-a716-446655440002"
    ],
    "start_row": 1,
    "start_column": 1,
    "gap_width_m": "1.0",
    "gap_height_m": "1.0",
    "columns_per_row": 10,
    "angle_deg": "0.0",
    "apply": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/auto-place',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'section_uuid' => '550e8400-e29b-41d4-a716-446655440001',
            'tracker_uuids' => [
                '550e8400-e29b-41d4-a716-446655440002',
            ],
            'start_row' => 1,
            'start_column' => 1,
            'gap_width_m' => '1.0',
            'gap_height_m' => '1.0',
            'columns_per_row' => 10,
            'angle_deg' => '0.0',
            'apply' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/auto-place'
payload = {
    "section_uuid": "550e8400-e29b-41d4-a716-446655440001",
    "tracker_uuids": [
        "550e8400-e29b-41d4-a716-446655440002"
    ],
    "start_row": 1,
    "start_column": 1,
    "gap_width_m": "1.0",
    "gap_height_m": "1.0",
    "columns_per_row": 10,
    "angle_deg": "0.0",
    "apply": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "success": true,
    "message": "Trackers placed successfully",
    "applied": true,
    "count": 25,
    "placements": [
        {
            "uuid": "550e8400-e29b-41d4-a716-446655440002",
            "collectorUuid": "550e8400-e29b-41d4-a716-446655440003",
            "row": 1,
            "column": 1,
            "angleDeg": 0
        }
    ],
    "section": {
        "uuid": "550e8400-e29b-41d4-a716-446655440001",
        "name": "North Field",
        "slug": "north-field"
    }
}
 

Request      

POST api/v1/sa/farms/{farm_uuid}/trackers/auto-place

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

farm   string   

The UUID of the farm Example: fugiat

Body Parameters

section_uuid   string   

Section UUID for placement. Example: 550e8400-e29b-41d4-a716-446655440001

tracker_uuids   string[]   

Tracker UUIDs to place.

start_row   integer  optional  

Starting row (1-based). Example: 1

start_column   integer  optional  

Starting column (1-based). Example: 1

gap_width_m   numeric  optional  

Gap width in meters. Example: 1.0

gap_height_m   numeric  optional  

Gap height in meters. Example: 1.0

columns_per_row   integer  optional  

Columns per row. Example: 10

angle_deg   numeric  optional  

Optional angle override. Example: 0.0

apply   boolean  optional  

Whether to apply changes. Example: true

Auto-place unplaced trackers

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/auto-place-unplaced" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"section_uuid\": \"550e8400-e29b-41d4-a716-446655440001\",
    \"start_row\": 1,
    \"start_column\": 1,
    \"columns_per_row\": 10,
    \"apply\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/auto-place-unplaced"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "section_uuid": "550e8400-e29b-41d4-a716-446655440001",
    "start_row": 1,
    "start_column": 1,
    "columns_per_row": 10,
    "apply": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/auto-place-unplaced',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'section_uuid' => '550e8400-e29b-41d4-a716-446655440001',
            'start_row' => 1,
            'start_column' => 1,
            'columns_per_row' => 10,
            'apply' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/auto-place-unplaced'
payload = {
    "section_uuid": "550e8400-e29b-41d4-a716-446655440001",
    "start_row": 1,
    "start_column": 1,
    "columns_per_row": 10,
    "apply": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
  "success": true,
  "message": "Unplaced trackers filled successfully",
  "applied": true,
  "count": 15,
  "placements": [...]
}
 

Request      

POST api/v1/sa/farms/{farm_uuid}/trackers/auto-place-unplaced

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

farm   string   

The UUID of the farm Example: et

Body Parameters

section_uuid   string  optional  

Optional section UUID filter. Example: 550e8400-e29b-41d4-a716-446655440001

start_row   integer  optional  

Starting row (1-based). Example: 1

start_column   integer  optional  

Starting column (1-based). Example: 1

columns_per_row   integer  optional  

Columns per row. Example: 10

apply   boolean  optional  

Whether to apply changes. Example: true

Validate layout for conflicts

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/validate-layout?sectionUuid=550e8400-e29b-41d4-a716-446655440001" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/validate-layout"
);

const params = {
    "sectionUuid": "550e8400-e29b-41d4-a716-446655440001",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/validate-layout',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'sectionUuid' => '550e8400-e29b-41d4-a716-446655440001',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/validate-layout'
params = {
  'sectionUuid': '550e8400-e29b-41d4-a716-446655440001',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "valid": false,
    "totalTrackers": 150,
    "conflicts": 2,
    "duplicates": [
        {
            "row": 5,
            "column": 10,
            "farmSectionUuid": "550e8400-e29b-41d4-a716-446655440001",
            "trackerUuids": [
                "uuid1",
                "uuid2"
            ]
        }
    ]
}
 

Request      

GET api/v1/sa/farms/{farm_uuid}/trackers/validate-layout

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

farm   string   

The UUID of the farm Example: aut

Query Parameters

sectionUuid   string  optional  

Optional section UUID filter. Example: 550e8400-e29b-41d4-a716-446655440001

Resolve overlapping trackers

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/resolve-overlaps" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"sectionUuid\": \"550e8400-e29b-41d4-a716-446655440001\",
    \"apply\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/resolve-overlaps"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "sectionUuid": "550e8400-e29b-41d4-a716-446655440001",
    "apply": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/resolve-overlaps',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'sectionUuid' => '550e8400-e29b-41d4-a716-446655440001',
            'apply' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/resolve-overlaps'
payload = {
    "sectionUuid": "550e8400-e29b-41d4-a716-446655440001",
    "apply": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "success": true,
    "message": "Resolved 2 overlapping tracker(s)",
    "data": {
        "applied": true,
        "resolvedCount": 2,
        "remainingConflictCount": 0,
        "placements": [
            {
                "trackerUuid": "550e8400-e29b-41d4-a716-446655440001",
                "collectorUuid": "550e8400-e29b-41d4-a716-446655440002",
                "previousRow": 1,
                "previousColumn": 1,
                "newRow": 1,
                "newColumn": 2
            }
        ]
    }
}
 

Request      

POST api/v1/sa/farms/{farm_uuid}/trackers/resolve-overlaps

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

farm   string   

The UUID of the farm Example: voluptatem

Body Parameters

sectionUuid   string  optional  

Optional section UUID filter. Example: 550e8400-e29b-41d4-a716-446655440001

apply   boolean  optional  

Whether to apply changes or preview. Example: true

Snap trackers to a section

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/snap-to-section" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"sectionUuid\": \"550e8400-e29b-41d4-a716-446655440001\",
    \"trackerUuids\": [
        \"550e8400-e29b-41d4-a716-446655440002\"
    ],
    \"startRow\": 1,
    \"startColumn\": 1,
    \"columnsPerRow\": 10,
    \"apply\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/snap-to-section"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "sectionUuid": "550e8400-e29b-41d4-a716-446655440001",
    "trackerUuids": [
        "550e8400-e29b-41d4-a716-446655440002"
    ],
    "startRow": 1,
    "startColumn": 1,
    "columnsPerRow": 10,
    "apply": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/snap-to-section',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'sectionUuid' => '550e8400-e29b-41d4-a716-446655440001',
            'trackerUuids' => [
                '550e8400-e29b-41d4-a716-446655440002',
            ],
            'startRow' => 1,
            'startColumn' => 1,
            'columnsPerRow' => 10,
            'apply' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/farms/c9b4c54e-a135-4a7f-86c9-7f03b9329a1b/trackers/snap-to-section'
payload = {
    "sectionUuid": "550e8400-e29b-41d4-a716-446655440001",
    "trackerUuids": [
        "550e8400-e29b-41d4-a716-446655440002"
    ],
    "startRow": 1,
    "startColumn": 1,
    "columnsPerRow": 10,
    "apply": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
  "success": true,
  "message": "Snapped 5 tracker(s) to section North Field",
  "data": {
    "applied": true,
    "count": 5,
    "sectionUuid": "550e8400-e29b-41d4-a716-446655440001",
    "sectionName": "North Field",
    "placements": [...]
  }
}
 

Request      

POST api/v1/sa/farms/{farm_uuid}/trackers/snap-to-section

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

farm_uuid   string   

Example: c9b4c54e-a135-4a7f-86c9-7f03b9329a1b

farm   string   

The UUID of the farm Example: unde

Body Parameters

sectionUuid   string   

Section UUID to snap to. Example: 550e8400-e29b-41d4-a716-446655440001

trackerUuids   string[]  optional  

Optional specific tracker UUIDs.

startRow   integer  optional  

Starting row (1-based). Example: 1

startColumn   integer  optional  

Starting column (1-based). Example: 1

columnsPerRow   integer  optional  

Columns per row. Example: 10

apply   boolean  optional  

Whether to apply changes or preview. Example: true

List trackers across farms (optionally filtered by farm UUID)

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/trackers?farmUuid=550e8400-e29b-41d4-a716-446655440000&sectionUuid=550e8400-e29b-41d4-a716-446655440001&isCurrent=1&placed=1&sectioned=1&perPage=50" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"farmUuid\": \"dddabba7-d68f-37b0-9e5d-da2b9df848c6\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/trackers"
);

const params = {
    "farmUuid": "550e8400-e29b-41d4-a716-446655440000",
    "sectionUuid": "550e8400-e29b-41d4-a716-446655440001",
    "isCurrent": "1",
    "placed": "1",
    "sectioned": "1",
    "perPage": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "farmUuid": "dddabba7-d68f-37b0-9e5d-da2b9df848c6"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/trackers',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'sectionUuid' => '550e8400-e29b-41d4-a716-446655440001',
            'isCurrent' => '1',
            'placed' => '1',
            'sectioned' => '1',
            'perPage' => '50',
        ],
        'json' => [
            'farmUuid' => 'dddabba7-d68f-37b0-9e5d-da2b9df848c6',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/trackers'
payload = {
    "farmUuid": "dddabba7-d68f-37b0-9e5d-da2b9df848c6"
}
params = {
  'farmUuid': '550e8400-e29b-41d4-a716-446655440000',
  'sectionUuid': '550e8400-e29b-41d4-a716-446655440001',
  'isCurrent': '1',
  'placed': '1',
  'sectioned': '1',
  'perPage': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload, params=params)
response.json()

Example response (200):


{
    "data": [
        {
            "uuid": "a205ee53-a5ce-4ecf-8103-d1ace6488432",
            "collectorUuid": "a5ed3d06-9ac9-4eaf-8ea3-c7ec9dcafe54",
            "collectorType": "TCU",
            "farmUuid": null,
            "farmSectionUuid": "9d97ca6c-31f2-45e3-a586-2656291af1eb",
            "row": 0,
            "column": 0,
            "widthM": "5.00",
            "heightM": "2.00",
            "angleDeg": "0.00",
            "location": null,
            "locationJson": null,
            "metadata": null,
            "isCurrent": false,
            "activeFrom": "2026-01-14T20:08:43+00:00",
            "activeTo": "2026-03-10T09:42:17+00:00",
            "createdAt": "2026-01-14T20:08:43+00:00",
            "updatedAt": "2026-03-10T09:42:17+00:00",
            "collector": {
                "uuid": "a5ed3d06-9ac9-4eaf-8ea3-c7ec9dcafe54",
                "collectorTypeSlug": "tcu",
                "serial": "9",
                "name": "Auto-created TCU Collector 9",
                "enabled": true
            },
            "farmSection": {
                "uuid": "9d97ca6c-31f2-45e3-a586-2656291af1eb",
                "name": "Section1",
                "description": "",
                "enabled": true,
                "orderColumn": 0,
                "location": {
                    "lat": -25.860111769169364,
                    "lng": 28.194855451583862
                },
                "locationJson": {
                    "latitude": -25.860111769169364,
                    "longitude": 28.194855451583862
                },
                "metadata": null,
                "createdAt": "2025-12-17T18:48:47+00:00",
                "updatedAt": "2026-02-08T10:22:07+00:00",
                "isUnassigned": false
            }
        },
        {
            "uuid": "a205ee53-a5ce-4ecf-8103-d1ace6488432",
            "collectorUuid": "a5ed3d06-9ac9-4eaf-8ea3-c7ec9dcafe54",
            "collectorType": "TCU",
            "farmUuid": null,
            "farmSectionUuid": "9d97ca6c-31f2-45e3-a586-2656291af1eb",
            "row": 0,
            "column": 0,
            "widthM": "5.00",
            "heightM": "2.00",
            "angleDeg": "0.00",
            "location": null,
            "locationJson": null,
            "metadata": null,
            "isCurrent": false,
            "activeFrom": "2026-01-14T20:08:43+00:00",
            "activeTo": "2026-03-10T09:42:17+00:00",
            "createdAt": "2026-01-14T20:08:43+00:00",
            "updatedAt": "2026-03-10T09:42:17+00:00",
            "collector": {
                "uuid": "a5ed3d06-9ac9-4eaf-8ea3-c7ec9dcafe54",
                "collectorTypeSlug": "tcu",
                "serial": "9",
                "name": "Auto-created TCU Collector 9",
                "enabled": true
            },
            "farmSection": {
                "uuid": "9d97ca6c-31f2-45e3-a586-2656291af1eb",
                "name": "Section1",
                "description": "",
                "enabled": true,
                "orderColumn": 0,
                "location": {
                    "lat": -25.860111769169364,
                    "lng": 28.194855451583862
                },
                "locationJson": {
                    "latitude": -25.860111769169364,
                    "longitude": 28.194855451583862
                },
                "metadata": null,
                "createdAt": "2025-12-17T18:48:47+00:00",
                "updatedAt": "2026-02-08T10:22:07+00:00",
                "isUnassigned": false
            }
        }
    ]
}
 

Request      

GET api/v1/sa/trackers

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

farmUuid   string  optional  

Optional farm UUID filter. Example: 550e8400-e29b-41d4-a716-446655440000

sectionUuid   string  optional  

Filter by section UUID. Example: 550e8400-e29b-41d4-a716-446655440001

isCurrent   boolean  optional  

Filter by current status. Example: true

placed   boolean  optional  

Filter by placement status. Example: true

sectioned   boolean  optional  

Filter by section assignment. Example: true

perPage   integer  optional  

Results per page (max 200). Example: 50

Body Parameters

farmUuid   string  optional  

Must be a valid UUID. The uuid of an existing record in the farms table. Example: dddabba7-d68f-37b0-9e5d-da2b9df848c6

Update a single tracker

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/trackers/a205ee53-a5ce-4ecf-8103-d1ace6488432" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"row\": 5,
    \"column\": 10,
    \"widthM\": \"6.0\",
    \"heightM\": \"2.5\",
    \"angleDeg\": \"15.0\",
    \"farmSectionUuid\": \"550e8400-e29b-41d4-a716-446655440002\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/trackers/a205ee53-a5ce-4ecf-8103-d1ace6488432"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "row": 5,
    "column": 10,
    "widthM": "6.0",
    "heightM": "2.5",
    "angleDeg": "15.0",
    "farmSectionUuid": "550e8400-e29b-41d4-a716-446655440002"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/trackers/a205ee53-a5ce-4ecf-8103-d1ace6488432',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'row' => 5,
            'column' => 10,
            'widthM' => '6.0',
            'heightM' => '2.5',
            'angleDeg' => '15.0',
            'farmSectionUuid' => '550e8400-e29b-41d4-a716-446655440002',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/trackers/a205ee53-a5ce-4ecf-8103-d1ace6488432'
payload = {
    "row": 5,
    "column": 10,
    "widthM": "6.0",
    "heightM": "2.5",
    "angleDeg": "15.0",
    "farmSectionUuid": "550e8400-e29b-41d4-a716-446655440002"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "success": true,
    "message": "Tracker updated successfully",
    "data": {
        "trackerUuid": "550e8400-e29b-41d4-a716-446655440001",
        "layout": {
            "uuid": "550e8400-e29b-41d4-a716-446655440001",
            "row": 5,
            "column": 10,
            "widthM": 6,
            "heightM": 2.5,
            "angleDeg": 15,
            "farmSectionUuid": "550e8400-e29b-41d4-a716-446655440002"
        }
    }
}
 

Request      

PATCH api/v1/sa/trackers/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: a205ee53-a5ce-4ecf-8103-d1ace6488432

tracker   string   

The UUID of the tracker Example: distinctio

Body Parameters

row   integer  optional  

Row position. Example: 5

column   integer  optional  

Column position. Example: 10

widthM   numeric  optional  

Width in meters. Example: 6.0

heightM   numeric  optional  

Height in meters. Example: 2.5

angleDeg   numeric  optional  

Angle in degrees. Example: 15.0

farmSectionUuid   string  optional  

Farm section UUID. Example: 550e8400-e29b-41d4-a716-446655440002

Delete (end) a single tracker

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/trackers/a205ee53-a5ce-4ecf-8103-d1ace6488432" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/trackers/a205ee53-a5ce-4ecf-8103-d1ace6488432"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/trackers/a205ee53-a5ce-4ecf-8103-d1ace6488432',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/trackers/a205ee53-a5ce-4ecf-8103-d1ace6488432'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (204, Success):

[Empty response]
 

Example response (404, Not Found):


{
    "success": false,
    "message": "Tracker not found"
}
 

Request      

DELETE api/v1/sa/trackers/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: a205ee53-a5ce-4ecf-8103-d1ace6488432

tracker   string   

The UUID of the tracker Example: aut

Copy collector locations to trackers

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/trackers/copy-locations" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"tracker_uuids\": [
        \"550e8400-e29b-41d4-a716-446655440001\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/trackers/copy-locations"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "tracker_uuids": [
        "550e8400-e29b-41d4-a716-446655440001"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/trackers/copy-locations',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'tracker_uuids' => [
                '550e8400-e29b-41d4-a716-446655440001',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/trackers/copy-locations'
payload = {
    "tracker_uuids": [
        "550e8400-e29b-41d4-a716-446655440001"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "success": true,
    "message": "Copied locations for 10 trackers",
    "count": 10
}
 

Request      

POST api/v1/sa/trackers/copy-locations

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

tracker_uuids   string[]   

Tracker UUIDs.

GET api/v1/sa/data-unit-types

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/data-unit-types?enabled=1&search=celsius&dataTypeSlug=numeric&orderBy=orderColumn&direction=asc&perPage=50" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/data-unit-types"
);

const params = {
    "enabled": "1",
    "search": "celsius",
    "dataTypeSlug": "numeric",
    "orderBy": "orderColumn",
    "direction": "asc",
    "perPage": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/data-unit-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'enabled' => '1',
            'search' => 'celsius',
            'dataTypeSlug' => 'numeric',
            'orderBy' => 'orderColumn',
            'direction' => 'asc',
            'perPage' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/data-unit-types'
params = {
  'enabled': '1',
  'search': 'celsius',
  'dataTypeSlug': 'numeric',
  'orderBy': 'orderColumn',
  'direction': 'asc',
  'perPage': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/data-unit-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

enabled   boolean  optional  

Filter by enabled status. Example: true

search   string  optional  

Search by name, slug, or description. Must not be greater than 255 characters. Example: celsius

dataTypeSlug   string  optional  

Filter by data type slug. The slug of an existing record in the data_types table. Example: numeric

orderBy   string  optional  

Sort field. Example: orderColumn

direction   string  optional  

Sort direction. Example: asc

perPage   integer  optional  

Items per page (max 200). Must be at least 1. Must not be greater than 200. Example: 50

POST api/v1/sa/data-unit-types

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/data-unit-types" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"celsius\",
    \"name\": \"Celsius\",
    \"unit\": \"°C\",
    \"description\": \"Temperature in degrees Celsius\",
    \"dataTypeSlug\": \"numeric\",
    \"orderColumn\": 1,
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/data-unit-types"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "celsius",
    "name": "Celsius",
    "unit": "°C",
    "description": "Temperature in degrees Celsius",
    "dataTypeSlug": "numeric",
    "orderColumn": 1,
    "enabled": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/data-unit-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'celsius',
            'name' => 'Celsius',
            'unit' => '°C',
            'description' => 'Temperature in degrees Celsius',
            'dataTypeSlug' => 'numeric',
            'orderColumn' => 1,
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/data-unit-types'
payload = {
    "slug": "celsius",
    "name": "Celsius",
    "unit": "°C",
    "description": "Temperature in degrees Celsius",
    "dataTypeSlug": "numeric",
    "orderColumn": 1,
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/data-unit-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

data_type_slug   string  optional  
order_column   string  optional  
slug   string   

Unique identifier for the data unit. Must not be greater than 255 characters. Example: celsius

name   string   

Display name for the data unit. Must not be greater than 255 characters. Example: Celsius

unit   string  optional  

Unit symbol or abbreviation. Must not be greater than 50 characters. Example: °C

description   string  optional  

Description of the data unit. Example: Temperature in degrees Celsius

dataTypeSlug   string   

Data type identifier (slug). The slug of an existing record in the data_types table. Example: numeric

orderColumn   integer  optional  

Display order. Example: 1

enabled   boolean  optional  

Whether the data unit is enabled. Example: true

GET api/v1/sa/data-unit-types/export

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/data-unit-types/export" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/data-unit-types/export"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/data-unit-types/export',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/data-unit-types/export'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/data-unit-types/export

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/sa/data-unit-types/{dataUnit_slug}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/data-unit-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/data-unit-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/data-unit-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/data-unit-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/data-unit-types/{dataUnit_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

dataUnit_slug   string   

The slug of the dataUnit. Example: unknown

PATCH api/v1/sa/data-unit-types/{dataUnit_slug}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/data-unit-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"celsius-updated\",
    \"name\": \"Celsius Updated\",
    \"unit\": \"°C\",
    \"description\": \"Updated temperature description\",
    \"dataTypeSlug\": \"numeric\",
    \"orderColumn\": 1,
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/data-unit-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "celsius-updated",
    "name": "Celsius Updated",
    "unit": "°C",
    "description": "Updated temperature description",
    "dataTypeSlug": "numeric",
    "orderColumn": 1,
    "enabled": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/data-unit-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'celsius-updated',
            'name' => 'Celsius Updated',
            'unit' => '°C',
            'description' => 'Updated temperature description',
            'dataTypeSlug' => 'numeric',
            'orderColumn' => 1,
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/data-unit-types/unknown'
payload = {
    "slug": "celsius-updated",
    "name": "Celsius Updated",
    "unit": "°C",
    "description": "Updated temperature description",
    "dataTypeSlug": "numeric",
    "orderColumn": 1,
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/data-unit-types/{dataUnit_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

dataUnit_slug   string   

The slug of the dataUnit. Example: unknown

Body Parameters

data_type_slug   string  optional  
order_column   string  optional  
slug   string   

Unique identifier for the data unit. Must not be greater than 255 characters. Example: celsius-updated

name   string   

Display name for the data unit. Must not be greater than 255 characters. Example: Celsius Updated

unit   string  optional  

Unit symbol or abbreviation. Must not be greater than 50 characters. Example: °C

description   string  optional  

Description of the data unit. Example: Updated temperature description

dataTypeSlug   string   

Data type identifier (slug). The slug of an existing record in the data_types table. Example: numeric

orderColumn   integer  optional  

Display order. Example: 1

enabled   boolean  optional  

Whether the data unit is enabled. Example: true

DELETE api/v1/sa/data-unit-types/{dataUnit_slug}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/data-unit-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/data-unit-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/data-unit-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/data-unit-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/data-unit-types/{dataUnit_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

dataUnit_slug   string   

The slug of the dataUnit. Example: unknown

GET api/v1/sa/collector-measurement-types

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/collector-measurement-types?enabled=1&orderBy=orderColumn&direction=asc&perPage=50" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-measurement-types"
);

const params = {
    "enabled": "1",
    "orderBy": "orderColumn",
    "direction": "asc",
    "perPage": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/collector-measurement-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'enabled' => '1',
            'orderBy' => 'orderColumn',
            'direction' => 'asc',
            'perPage' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-measurement-types'
params = {
  'enabled': '1',
  'orderBy': 'orderColumn',
  'direction': 'asc',
  'perPage': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/collector-measurement-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

enabled   boolean  optional  

Filter by enabled status. Example: true

orderBy   string  optional  

Sort field. Example: orderColumn

direction   string  optional  

Sort direction. Example: asc

perPage   integer  optional  

Items per page (max 200). Must be at least 1. Must not be greater than 200. Example: 50

POST api/v1/sa/collector-measurement-types

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/collector-measurement-types" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"temperature\",
    \"name\": \"Temperature\",
    \"description\": \"Ambient temperature measurement\",
    \"dataUnitSlug\": \"celsius\",
    \"collectorTypeSlug\": \"tcu\",
    \"orderColumn\": 1,
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-measurement-types"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "temperature",
    "name": "Temperature",
    "description": "Ambient temperature measurement",
    "dataUnitSlug": "celsius",
    "collectorTypeSlug": "tcu",
    "orderColumn": 1,
    "enabled": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/collector-measurement-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'temperature',
            'name' => 'Temperature',
            'description' => 'Ambient temperature measurement',
            'dataUnitSlug' => 'celsius',
            'collectorTypeSlug' => 'tcu',
            'orderColumn' => 1,
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-measurement-types'
payload = {
    "slug": "temperature",
    "name": "Temperature",
    "description": "Ambient temperature measurement",
    "dataUnitSlug": "celsius",
    "collectorTypeSlug": "tcu",
    "orderColumn": 1,
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/collector-measurement-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

slug   string   

Unique identifier for the measurement type. Must not be greater than 255 characters. Example: temperature

name   string   

Display name for the measurement type. Must not be greater than 255 characters. Example: Temperature

description   string  optional  

Description of the measurement type. Example: Ambient temperature measurement

dataUnitSlug   string   

Data unit identifier (slug). The slug of an existing record in the data_units table. Example: celsius

collectorTypeSlug   string  optional  

Collector type this measurement applies to (ncu, tcu, or null for both). The slug of an existing record in the collector_types table. Example: tcu

orderColumn   integer  optional  

Display order. Example: 1

enabled   boolean  optional  

Whether the measurement type is enabled. Example: true

GET api/v1/sa/collector-measurement-types/export

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/collector-measurement-types/export" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-measurement-types/export"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/collector-measurement-types/export',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-measurement-types/export'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/collector-measurement-types/export

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/sa/collector-measurement-types/{collectorMeasurementType_slug}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/collector-measurement-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-measurement-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/collector-measurement-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-measurement-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/collector-measurement-types/{collectorMeasurementType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collectorMeasurementType_slug   string   

The slug of the collectorMeasurementType. Example: unknown

PATCH api/v1/sa/collector-measurement-types/{collectorMeasurementType_slug}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/collector-measurement-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"temperature-updated\",
    \"name\": \"Temperature Updated\",
    \"description\": \"Updated ambient temperature measurement\",
    \"dataUnitSlug\": \"celsius\",
    \"collectorTypeSlug\": \"tcu\",
    \"orderColumn\": 1,
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-measurement-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "temperature-updated",
    "name": "Temperature Updated",
    "description": "Updated ambient temperature measurement",
    "dataUnitSlug": "celsius",
    "collectorTypeSlug": "tcu",
    "orderColumn": 1,
    "enabled": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/collector-measurement-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'temperature-updated',
            'name' => 'Temperature Updated',
            'description' => 'Updated ambient temperature measurement',
            'dataUnitSlug' => 'celsius',
            'collectorTypeSlug' => 'tcu',
            'orderColumn' => 1,
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-measurement-types/unknown'
payload = {
    "slug": "temperature-updated",
    "name": "Temperature Updated",
    "description": "Updated ambient temperature measurement",
    "dataUnitSlug": "celsius",
    "collectorTypeSlug": "tcu",
    "orderColumn": 1,
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/collector-measurement-types/{collectorMeasurementType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collectorMeasurementType_slug   string   

The slug of the collectorMeasurementType. Example: unknown

Body Parameters

slug   string   

Unique identifier for the measurement type. Must not be greater than 255 characters. Example: temperature-updated

name   string   

Display name for the measurement type. Must not be greater than 255 characters. Example: Temperature Updated

description   string  optional  

Description of the measurement type. Example: Updated ambient temperature measurement

dataUnitSlug   string   

Data unit identifier (slug). The slug of an existing record in the data_units table. Example: celsius

collectorTypeSlug   string  optional  

Collector type this measurement applies to (ncu, tcu, or null for both). The slug of an existing record in the collector_types table. Example: tcu

orderColumn   integer  optional  

Display order. Example: 1

enabled   boolean  optional  

Whether the measurement type is enabled. Example: true

DELETE api/v1/sa/collector-measurement-types/{collectorMeasurementType_slug}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/collector-measurement-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-measurement-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/collector-measurement-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-measurement-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/collector-measurement-types/{collectorMeasurementType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collectorMeasurementType_slug   string   

The slug of the collectorMeasurementType. Example: unknown

GET api/v1/sa/collector-parameter-types

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/collector-parameter-types?enabled=1&orderBy=orderColumn&direction=asc&perPage=50" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-types"
);

const params = {
    "enabled": "1",
    "orderBy": "orderColumn",
    "direction": "asc",
    "perPage": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/collector-parameter-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'enabled' => '1',
            'orderBy' => 'orderColumn',
            'direction' => 'asc',
            'perPage' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-parameter-types'
params = {
  'enabled': '1',
  'orderBy': 'orderColumn',
  'direction': 'asc',
  'perPage': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/collector-parameter-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

enabled   boolean  optional  

Filter by enabled status. Example: true

orderBy   string  optional  

Sort field. Example: orderColumn

direction   string  optional  

Sort direction. Example: asc

perPage   integer  optional  

Items per page (max 200). Must be at least 1. Must not be greater than 200. Example: 50

POST api/v1/sa/collector-parameter-types

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-types" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"tracking-mode\",
    \"name\": \"Tracking Mode\",
    \"description\": \"Collector tracking mode configuration\",
    \"dataUnitSlug\": \"string\",
    \"collectorTypeSlug\": \"tcu\",
    \"orderColumn\": 1,
    \"enabled\": true,
    \"isReadOnly\": false
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-types"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "tracking-mode",
    "name": "Tracking Mode",
    "description": "Collector tracking mode configuration",
    "dataUnitSlug": "string",
    "collectorTypeSlug": "tcu",
    "orderColumn": 1,
    "enabled": true,
    "isReadOnly": false
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/collector-parameter-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'tracking-mode',
            'name' => 'Tracking Mode',
            'description' => 'Collector tracking mode configuration',
            'dataUnitSlug' => 'string',
            'collectorTypeSlug' => 'tcu',
            'orderColumn' => 1,
            'enabled' => true,
            'isReadOnly' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-parameter-types'
payload = {
    "slug": "tracking-mode",
    "name": "Tracking Mode",
    "description": "Collector tracking mode configuration",
    "dataUnitSlug": "string",
    "collectorTypeSlug": "tcu",
    "orderColumn": 1,
    "enabled": true,
    "isReadOnly": false
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/collector-parameter-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

slug   string   

Unique identifier for the parameter type. Must not be greater than 255 characters. Example: tracking-mode

name   string   

Display name for the parameter type. Must not be greater than 255 characters. Example: Tracking Mode

description   string  optional  

Description of the parameter type. Example: Collector tracking mode configuration

dataUnitSlug   string   

Data unit identifier (slug). The slug of an existing record in the data_units table. Example: string

collectorTypeSlug   string  optional  

Collector type this parameter applies to (ncu, tcu, or null for both). The slug of an existing record in the collector_types table. Example: tcu

orderColumn   integer  optional  

Display order. Example: 1

enabled   boolean  optional  

Whether the parameter type is enabled. Example: true

isReadOnly   boolean  optional  

Whether the parameter is read-only. Example: false

GET api/v1/sa/collector-parameter-types/export

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/collector-parameter-types/export" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-types/export"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/collector-parameter-types/export',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-parameter-types/export'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/collector-parameter-types/export

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/sa/collector-parameter-types/{collectorParameterType_slug}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/collector-parameter-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/collector-parameter-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-parameter-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/collector-parameter-types/{collectorParameterType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collectorParameterType_slug   string   

The slug of the collectorParameterType. Example: unknown

PATCH api/v1/sa/collector-parameter-types/{collectorParameterType_slug}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"tracking-mode-updated\",
    \"name\": \"Tracking Mode Updated\",
    \"description\": \"Updated collector tracking mode configuration\",
    \"dataUnitSlug\": \"string\",
    \"collectorTypeSlug\": \"tcu\",
    \"orderColumn\": 1,
    \"enabled\": true,
    \"isReadOnly\": false
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "tracking-mode-updated",
    "name": "Tracking Mode Updated",
    "description": "Updated collector tracking mode configuration",
    "dataUnitSlug": "string",
    "collectorTypeSlug": "tcu",
    "orderColumn": 1,
    "enabled": true,
    "isReadOnly": false
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/collector-parameter-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'tracking-mode-updated',
            'name' => 'Tracking Mode Updated',
            'description' => 'Updated collector tracking mode configuration',
            'dataUnitSlug' => 'string',
            'collectorTypeSlug' => 'tcu',
            'orderColumn' => 1,
            'enabled' => true,
            'isReadOnly' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-parameter-types/unknown'
payload = {
    "slug": "tracking-mode-updated",
    "name": "Tracking Mode Updated",
    "description": "Updated collector tracking mode configuration",
    "dataUnitSlug": "string",
    "collectorTypeSlug": "tcu",
    "orderColumn": 1,
    "enabled": true,
    "isReadOnly": false
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/collector-parameter-types/{collectorParameterType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collectorParameterType_slug   string   

The slug of the collectorParameterType. Example: unknown

Body Parameters

slug   string   

Unique identifier for the parameter type. Must not be greater than 255 characters. Example: tracking-mode-updated

name   string   

Display name for the parameter type. Must not be greater than 255 characters. Example: Tracking Mode Updated

description   string  optional  

Description of the parameter type. Example: Updated collector tracking mode configuration

dataUnitSlug   string   

Data unit identifier (slug). The slug of an existing record in the data_units table. Example: string

collectorTypeSlug   string  optional  

Collector type this parameter applies to (ncu, tcu, or null for both). The slug of an existing record in the collector_types table. Example: tcu

orderColumn   integer  optional  

Display order. Example: 1

enabled   boolean  optional  

Whether the parameter type is enabled. Example: true

isReadOnly   boolean  optional  

Whether the parameter is read-only. Example: false

DELETE api/v1/sa/collector-parameter-types/{collectorParameterType_slug}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/collector-parameter-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-parameter-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/collector-parameter-types/{collectorParameterType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collectorParameterType_slug   string   

The slug of the collectorParameterType. Example: unknown

GET api/v1/sa/collector-parameter-validation-rules

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules?enabled=1&orderBy=collectorParameterTypeSlug&direction=asc&perPage=50" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules"
);

const params = {
    "enabled": "1",
    "orderBy": "collectorParameterTypeSlug",
    "direction": "asc",
    "perPage": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'enabled' => '1',
            'orderBy' => 'collectorParameterTypeSlug',
            'direction' => 'asc',
            'perPage' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules'
params = {
  'enabled': '1',
  'orderBy': 'collectorParameterTypeSlug',
  'direction': 'asc',
  'perPage': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/collector-parameter-validation-rules

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

enabled   boolean  optional  

Filter by enabled status. Example: true

orderBy   string  optional  

Sort field. Example: collectorParameterTypeSlug

direction   string  optional  

Sort direction. Example: asc

perPage   integer  optional  

Items per page (max 200). Must be at least 1. Must not be greater than 200. Example: 50

POST api/v1/sa/collector-parameter-validation-rules

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"collectorParameterTypeSlug\": \"tracking-mode\",
    \"minValueDecimal\": 0,
    \"maxValueDecimal\": 100,
    \"stringRegex\": \"^[a-zA-Z]+$\",
    \"defaultValue\": \"auto\",
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "collectorParameterTypeSlug": "tracking-mode",
    "minValueDecimal": 0,
    "maxValueDecimal": 100,
    "stringRegex": "^[a-zA-Z]+$",
    "defaultValue": "auto",
    "enabled": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'collectorParameterTypeSlug' => 'tracking-mode',
            'minValueDecimal' => 0.0,
            'maxValueDecimal' => 100.0,
            'stringRegex' => '^[a-zA-Z]+$',
            'defaultValue' => 'auto',
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules'
payload = {
    "collectorParameterTypeSlug": "tracking-mode",
    "minValueDecimal": 0,
    "maxValueDecimal": 100,
    "stringRegex": "^[a-zA-Z]+$",
    "defaultValue": "auto",
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/collector-parameter-validation-rules

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

collectorParameterTypeSlug   string   

Parameter type identifier. The slug of an existing record in the collector_parameter_types table. Example: tracking-mode

minValueDecimal   number  optional  

Minimum numeric value. Example: 0

maxValueDecimal   number  optional  

Maximum numeric value. Example: 100

stringRegex   string  optional  

Regex pattern for string validation. Must not be greater than 512 characters. Example: ^[a-zA-Z]+$

defaultValue   string  optional  

Default value for the parameter. Example: auto

enabled   boolean  optional  

Whether the validation rule is enabled. Example: true

GET api/v1/sa/collector-parameter-validation-rules/{collectorParameterType_slug}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/collector-parameter-validation-rules/{collectorParameterType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collectorParameterType_slug   string   

The slug of the collectorParameterType. Example: unknown

PATCH api/v1/sa/collector-parameter-validation-rules/{collectorParameterType_slug}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"collectorParameterTypeSlug\": \"tracking-mode\",
    \"minValueDecimal\": 0,
    \"maxValueDecimal\": 100,
    \"stringRegex\": \"^[a-zA-Z]+$\",
    \"defaultValue\": \"manual\",
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "collectorParameterTypeSlug": "tracking-mode",
    "minValueDecimal": 0,
    "maxValueDecimal": 100,
    "stringRegex": "^[a-zA-Z]+$",
    "defaultValue": "manual",
    "enabled": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'collectorParameterTypeSlug' => 'tracking-mode',
            'minValueDecimal' => 0.0,
            'maxValueDecimal' => 100.0,
            'stringRegex' => '^[a-zA-Z]+$',
            'defaultValue' => 'manual',
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/unknown'
payload = {
    "collectorParameterTypeSlug": "tracking-mode",
    "minValueDecimal": 0,
    "maxValueDecimal": 100,
    "stringRegex": "^[a-zA-Z]+$",
    "defaultValue": "manual",
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/collector-parameter-validation-rules/{collectorParameterType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collectorParameterType_slug   string   

The slug of the collectorParameterType. Example: unknown

Body Parameters

collectorParameterTypeSlug   string  optional  

Parameter type identifier. The slug of an existing record in the collector_parameter_types table. Example: tracking-mode

minValueDecimal   number  optional  

Minimum numeric value. Example: 0

maxValueDecimal   number  optional  

Maximum numeric value. Example: 100

stringRegex   string  optional  

Regex pattern for string validation. Must not be greater than 512 characters. Example: ^[a-zA-Z]+$

defaultValue   string  optional  

Default value for the parameter. Example: manual

enabled   boolean  optional  

Whether the validation rule is enabled. Example: true

DELETE api/v1/sa/collector-parameter-validation-rules/{collectorParameterType_slug}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/collector-parameter-validation-rules/{collectorParameterType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

collectorParameterType_slug   string   

The slug of the collectorParameterType. Example: unknown

POST api/v1/sa/collector-parameter-validation-rules/validate

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/validate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/validate"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/validate',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/collector-parameter-validation-rules/validate'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/sa/collector-parameter-validation-rules/validate

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/sa/device-model-types

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/device-model-types?enabled=1&collectorTypeSlug=ncu&orderBy=orderColumn&direction=asc&perPage=50" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/device-model-types"
);

const params = {
    "enabled": "1",
    "collectorTypeSlug": "ncu",
    "orderBy": "orderColumn",
    "direction": "asc",
    "perPage": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/device-model-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'enabled' => '1',
            'collectorTypeSlug' => 'ncu',
            'orderBy' => 'orderColumn',
            'direction' => 'asc',
            'perPage' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/device-model-types'
params = {
  'enabled': '1',
  'collectorTypeSlug': 'ncu',
  'orderBy': 'orderColumn',
  'direction': 'asc',
  'perPage': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/device-model-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

enabled   boolean  optional  

Filter by enabled status. Example: true

collectorTypeSlug   string  optional  

Filter by collector type slug. The slug of an existing record in the collector_types table. Example: ncu

orderBy   string  optional  

Sort field. Example: orderColumn

direction   string  optional  

Sort direction. Example: asc

perPage   integer  optional  

Items per page (max 200). Must be at least 1. Must not be greater than 200. Example: 50

POST api/v1/sa/device-model-types

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/device-model-types" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"ncu-v3\",
    \"name\": \"NCU Version 3\",
    \"description\": \"Network Control Unit version 3 with advanced features\",
    \"manufacturerTypeSlug\": \"tracklab\",
    \"collectorTypeSlug\": \"ncu\",
    \"capabilities\": {
        \"wifi\": \"true\",
        \"channels\": \"8\"
    },
    \"orderColumn\": 1,
    \"enabled\": true,
    \"hardwareVersionSlugs\": [
        {
            \"slug\": \"fugit\",
            \"isPrimary\": false,
            \"notes\": \"excepturi\"
        }
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/device-model-types"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "ncu-v3",
    "name": "NCU Version 3",
    "description": "Network Control Unit version 3 with advanced features",
    "manufacturerTypeSlug": "tracklab",
    "collectorTypeSlug": "ncu",
    "capabilities": {
        "wifi": "true",
        "channels": "8"
    },
    "orderColumn": 1,
    "enabled": true,
    "hardwareVersionSlugs": [
        {
            "slug": "fugit",
            "isPrimary": false,
            "notes": "excepturi"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/device-model-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'ncu-v3',
            'name' => 'NCU Version 3',
            'description' => 'Network Control Unit version 3 with advanced features',
            'manufacturerTypeSlug' => 'tracklab',
            'collectorTypeSlug' => 'ncu',
            'capabilities' => [
                'wifi' => 'true',
                'channels' => '8',
            ],
            'orderColumn' => 1,
            'enabled' => true,
            'hardwareVersionSlugs' => [
                [
                    'slug' => 'fugit',
                    'isPrimary' => false,
                    'notes' => 'excepturi',
                ],
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/device-model-types'
payload = {
    "slug": "ncu-v3",
    "name": "NCU Version 3",
    "description": "Network Control Unit version 3 with advanced features",
    "manufacturerTypeSlug": "tracklab",
    "collectorTypeSlug": "ncu",
    "capabilities": {
        "wifi": "true",
        "channels": "8"
    },
    "orderColumn": 1,
    "enabled": true,
    "hardwareVersionSlugs": [
        {
            "slug": "fugit",
            "isPrimary": false,
            "notes": "excepturi"
        }
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/device-model-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

slug   string  optional  

Unique identifier for the device model type (auto-generated from name if omitted). Must not be greater than 255 characters. Example: ncu-v3

name   string   

Display name for the device model type. Must not be greater than 255 characters. Example: NCU Version 3

description   string  optional  

Description of the device model type. Example: Network Control Unit version 3 with advanced features

manufacturerTypeSlug   string  optional  

Manufacturer type slug. The slug of an existing record in the manufacturer_types table. Example: tracklab

collectorTypeSlug   string  optional  

Associated collector type identifier (slug). The slug of an existing record in the collector_types table. Example: ncu

hardwareVersionSlugs   object[]  optional  
slug   string  optional  

This field is required when hardwareVersionSlugs.* is present. The slug of an existing record in the hardware_version_types table. Example: fugit

isPrimary   boolean  optional  

Example: false

notes   string  optional  

Example: excepturi

capabilities   object  optional  

Device capabilities as slug => value pairs.

orderColumn   integer  optional  

Display order. Example: 1

enabled   boolean  optional  

Whether the device model type is enabled. Example: true

GET api/v1/sa/device-model-types/export

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/device-model-types/export" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/device-model-types/export"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/device-model-types/export',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/device-model-types/export'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/device-model-types/export

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/sa/device-model-types/{deviceModelType_slug}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/device-model-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/device-model-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/device-model-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/device-model-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/device-model-types/{deviceModelType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

deviceModelType_slug   string   

The slug of the deviceModelType. Example: unknown

PATCH api/v1/sa/device-model-types/{deviceModelType_slug}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/device-model-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"ncu-v3-updated\",
    \"name\": \"NCU Version 3 Updated\",
    \"description\": \"Updated Network Control Unit version 3\",
    \"manufacturerTypeSlug\": \"tracklab\",
    \"collectorTypeSlug\": \"ncu\",
    \"capabilities\": {
        \"wifi\": \"true\",
        \"channels\": \"8\"
    },
    \"orderColumn\": 1,
    \"enabled\": true,
    \"hardwareVersionSlugs\": [
        {
            \"slug\": \"sit\",
            \"isPrimary\": false,
            \"notes\": \"quaerat\"
        }
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/device-model-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "ncu-v3-updated",
    "name": "NCU Version 3 Updated",
    "description": "Updated Network Control Unit version 3",
    "manufacturerTypeSlug": "tracklab",
    "collectorTypeSlug": "ncu",
    "capabilities": {
        "wifi": "true",
        "channels": "8"
    },
    "orderColumn": 1,
    "enabled": true,
    "hardwareVersionSlugs": [
        {
            "slug": "sit",
            "isPrimary": false,
            "notes": "quaerat"
        }
    ]
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/device-model-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'ncu-v3-updated',
            'name' => 'NCU Version 3 Updated',
            'description' => 'Updated Network Control Unit version 3',
            'manufacturerTypeSlug' => 'tracklab',
            'collectorTypeSlug' => 'ncu',
            'capabilities' => [
                'wifi' => 'true',
                'channels' => '8',
            ],
            'orderColumn' => 1,
            'enabled' => true,
            'hardwareVersionSlugs' => [
                [
                    'slug' => 'sit',
                    'isPrimary' => false,
                    'notes' => 'quaerat',
                ],
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/device-model-types/unknown'
payload = {
    "slug": "ncu-v3-updated",
    "name": "NCU Version 3 Updated",
    "description": "Updated Network Control Unit version 3",
    "manufacturerTypeSlug": "tracklab",
    "collectorTypeSlug": "ncu",
    "capabilities": {
        "wifi": "true",
        "channels": "8"
    },
    "orderColumn": 1,
    "enabled": true,
    "hardwareVersionSlugs": [
        {
            "slug": "sit",
            "isPrimary": false,
            "notes": "quaerat"
        }
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/device-model-types/{deviceModelType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

deviceModelType_slug   string   

The slug of the deviceModelType. Example: unknown

Body Parameters

slug   string  optional  

Unique identifier for the device model type. Must not be greater than 255 characters. Example: ncu-v3-updated

name   string  optional  

Display name for the device model type. Must not be greater than 255 characters. Example: NCU Version 3 Updated

description   string  optional  

Description of the device model type. Example: Updated Network Control Unit version 3

manufacturerTypeSlug   string  optional  

Manufacturer type slug. The slug of an existing record in the manufacturer_types table. Example: tracklab

collectorTypeSlug   string  optional  

Associated collector type identifier (slug). The slug of an existing record in the collector_types table. Example: ncu

hardwareVersionSlugs   object[]  optional  
slug   string  optional  

This field is required when hardwareVersionSlugs.* is present. The slug of an existing record in the hardware_version_types table. Example: sit

isPrimary   boolean  optional  

Example: false

notes   string  optional  

Example: quaerat

capabilities   object  optional  

Device capabilities as slug => value pairs.

orderColumn   integer  optional  

Display order. Example: 1

enabled   boolean  optional  

Whether the device model type is enabled. Example: true

DELETE api/v1/sa/device-model-types/{deviceModelType_slug}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/device-model-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/device-model-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/device-model-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/device-model-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/device-model-types/{deviceModelType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

deviceModelType_slug   string   

The slug of the deviceModelType. Example: unknown

GET api/v1/sa/manufacturer-types

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/manufacturer-types?enabled=1&search=tracklab&orderBy=orderColumn&direction=asc&perPage=50" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/manufacturer-types"
);

const params = {
    "enabled": "1",
    "search": "tracklab",
    "orderBy": "orderColumn",
    "direction": "asc",
    "perPage": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/manufacturer-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'enabled' => '1',
            'search' => 'tracklab',
            'orderBy' => 'orderColumn',
            'direction' => 'asc',
            'perPage' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/manufacturer-types'
params = {
  'enabled': '1',
  'search': 'tracklab',
  'orderBy': 'orderColumn',
  'direction': 'asc',
  'perPage': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/manufacturer-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

enabled   boolean  optional  

Filter by enabled status. Example: true

search   string  optional  

Search by name/slug. Must not be greater than 255 characters. Example: tracklab

orderBy   string  optional  

Sort field. Example: orderColumn

direction   string  optional  

Sort direction. Example: asc

perPage   integer  optional  

Items per page (max 200). Must be at least 1. Must not be greater than 200. Example: 50

POST api/v1/sa/manufacturer-types

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/manufacturer-types" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"tracklab\",
    \"name\": \"TrackLab\",
    \"description\": \"Solar tracking systems manufacturer\",
    \"websiteUrl\": \"https:\\/\\/tracklab.com\",
    \"supportEmail\": \"support@tracklab.com\",
    \"supportUrl\": \"https:\\/\\/tracklab.com\\/support\",
    \"orderColumn\": 1,
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/manufacturer-types"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "tracklab",
    "name": "TrackLab",
    "description": "Solar tracking systems manufacturer",
    "websiteUrl": "https:\/\/tracklab.com",
    "supportEmail": "support@tracklab.com",
    "supportUrl": "https:\/\/tracklab.com\/support",
    "orderColumn": 1,
    "enabled": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/manufacturer-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'tracklab',
            'name' => 'TrackLab',
            'description' => 'Solar tracking systems manufacturer',
            'websiteUrl' => 'https://tracklab.com',
            'supportEmail' => 'support@tracklab.com',
            'supportUrl' => 'https://tracklab.com/support',
            'orderColumn' => 1,
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/manufacturer-types'
payload = {
    "slug": "tracklab",
    "name": "TrackLab",
    "description": "Solar tracking systems manufacturer",
    "websiteUrl": "https:\/\/tracklab.com",
    "supportEmail": "support@tracklab.com",
    "supportUrl": "https:\/\/tracklab.com\/support",
    "orderColumn": 1,
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/manufacturer-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

slug   string   

Unique identifier for the manufacturer. Must not be greater than 255 characters. Example: tracklab

name   string   

Display name for the manufacturer. Must not be greater than 255 characters. Example: TrackLab

description   string  optional  

Description of the manufacturer. Example: Solar tracking systems manufacturer

websiteUrl   string  optional  

Manufacturer website URL. Must be a valid URL. Must not be greater than 500 characters. Example: https://tracklab.com

supportEmail   string  optional  

Support email address. Must be a valid email address. Must not be greater than 255 characters. Example: support@tracklab.com

supportUrl   string  optional  

Support page URL. Must be a valid URL. Must not be greater than 500 characters. Example: https://tracklab.com/support

orderColumn   integer  optional  

Display order. Example: 1

enabled   boolean  optional  

Whether the manufacturer is enabled. Example: true

GET api/v1/sa/manufacturer-types/export

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/manufacturer-types/export" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/manufacturer-types/export"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/manufacturer-types/export',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/manufacturer-types/export'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/manufacturer-types/export

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/sa/manufacturer-types/{manufacturerType_slug}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/manufacturer-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/manufacturer-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/manufacturer-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/manufacturer-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/manufacturer-types/{manufacturerType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

manufacturerType_slug   string   

The slug of the manufacturerType. Example: unknown

PATCH api/v1/sa/manufacturer-types/{manufacturerType_slug}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/manufacturer-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"tracklab\",
    \"name\": \"TrackLab\",
    \"description\": \"TrackLab supported manufacturer\",
    \"websiteUrl\": \"https:\\/\\/tracklab.example\",
    \"supportEmail\": \"support@tracklab.example\",
    \"supportUrl\": \"https:\\/\\/tracklab.example\\/support\",
    \"orderColumn\": 10,
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/manufacturer-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "tracklab",
    "name": "TrackLab",
    "description": "TrackLab supported manufacturer",
    "websiteUrl": "https:\/\/tracklab.example",
    "supportEmail": "support@tracklab.example",
    "supportUrl": "https:\/\/tracklab.example\/support",
    "orderColumn": 10,
    "enabled": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/manufacturer-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'tracklab',
            'name' => 'TrackLab',
            'description' => 'TrackLab supported manufacturer',
            'websiteUrl' => 'https://tracklab.example',
            'supportEmail' => 'support@tracklab.example',
            'supportUrl' => 'https://tracklab.example/support',
            'orderColumn' => 10,
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/manufacturer-types/unknown'
payload = {
    "slug": "tracklab",
    "name": "TrackLab",
    "description": "TrackLab supported manufacturer",
    "websiteUrl": "https:\/\/tracklab.example",
    "supportEmail": "support@tracklab.example",
    "supportUrl": "https:\/\/tracklab.example\/support",
    "orderColumn": 10,
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/manufacturer-types/{manufacturerType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

manufacturerType_slug   string   

The slug of the manufacturerType. Example: unknown

Body Parameters

slug   string  optional  

Manufacturer type slug (unique). Must not be greater than 255 characters. Example: tracklab

name   string  optional  

Manufacturer display name (unique). Must not be greater than 255 characters. Example: TrackLab

description   string  optional  

Optional description. Example: TrackLab supported manufacturer

websiteUrl   string  optional  

Optional website URL. Must be a valid URL. Must not be greater than 500 characters. Example: https://tracklab.example

supportEmail   string  optional  

Optional support email address. Must be a valid email address. Must not be greater than 255 characters. Example: support@tracklab.example

supportUrl   string  optional  

Optional support URL. Must be a valid URL. Must not be greater than 500 characters. Example: https://tracklab.example/support

orderColumn   integer  optional  

Optional display order. Example: 10

enabled   boolean  optional  

Enable/disable this type. Example: true

DELETE api/v1/sa/manufacturer-types/{manufacturerType_slug}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/manufacturer-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/manufacturer-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/manufacturer-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/manufacturer-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/manufacturer-types/{manufacturerType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

manufacturerType_slug   string   

The slug of the manufacturerType. Example: unknown

GET api/v1/sa/hardware-version-types

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/hardware-version-types?enabled=1&search=1.0&orderBy=orderColumn&direction=asc&perPage=50" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/hardware-version-types"
);

const params = {
    "enabled": "1",
    "search": "1.0",
    "orderBy": "orderColumn",
    "direction": "asc",
    "perPage": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/hardware-version-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'enabled' => '1',
            'search' => '1.0',
            'orderBy' => 'orderColumn',
            'direction' => 'asc',
            'perPage' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/hardware-version-types'
params = {
  'enabled': '1',
  'search': '1.0',
  'orderBy': 'orderColumn',
  'direction': 'asc',
  'perPage': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/hardware-version-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

enabled   boolean  optional  

Filter by enabled status. Example: true

search   string  optional  

Search by version/slug. Must not be greater than 255 characters. Example: 1.0

orderBy   string  optional  

Sort field. Example: orderColumn

direction   string  optional  

Sort direction. Example: asc

perPage   integer  optional  

Items per page (max 200). Must be at least 1. Must not be greater than 200. Example: 50

POST api/v1/sa/hardware-version-types

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/hardware-version-types" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"v1-0-0\",
    \"version\": \"1.0.0\",
    \"description\": \"Initial production release\",
    \"releaseDate\": \"2024-01-15\",
    \"orderColumn\": 1,
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/hardware-version-types"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "v1-0-0",
    "version": "1.0.0",
    "description": "Initial production release",
    "releaseDate": "2024-01-15",
    "orderColumn": 1,
    "enabled": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/hardware-version-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'v1-0-0',
            'version' => '1.0.0',
            'description' => 'Initial production release',
            'releaseDate' => '2024-01-15',
            'orderColumn' => 1,
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/hardware-version-types'
payload = {
    "slug": "v1-0-0",
    "version": "1.0.0",
    "description": "Initial production release",
    "releaseDate": "2024-01-15",
    "orderColumn": 1,
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/hardware-version-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

slug   string  optional  

Unique identifier (auto-generated from version if not provided). Must not be greater than 255 characters. Example: v1-0-0

version   string   

Semantic version string (e.g., 1.0, 2.5.1). Must match the regex /^\d+(.\d+){0,2}$/. Must not be greater than 50 characters. Example: 1.0.0

description   string  optional  

Description of the hardware version. Example: Initial production release

releaseDate   string  optional  

Release date (YYYY-MM-DD). Must be a valid date. Example: 2024-01-15

orderColumn   integer  optional  

Display order. Example: 1

enabled   boolean  optional  

Whether the hardware version is enabled. Example: true

GET api/v1/sa/hardware-version-types/export

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/hardware-version-types/export" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/hardware-version-types/export"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/hardware-version-types/export',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/hardware-version-types/export'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/hardware-version-types/export

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/sa/hardware-version-types/{hardwareVersionType_slug}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/hardware-version-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/hardware-version-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/hardware-version-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/hardware-version-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/hardware-version-types/{hardwareVersionType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

hardwareVersionType_slug   string   

The slug of the hardwareVersionType. Example: unknown

PATCH api/v1/sa/hardware-version-types/{hardwareVersionType_slug}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/hardware-version-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"ncu-v2\",
    \"version\": \"2.0.0\",
    \"description\": \"Second generation NCU hardware\",
    \"releaseDate\": \"2025-01-01\",
    \"orderColumn\": 10,
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/hardware-version-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "ncu-v2",
    "version": "2.0.0",
    "description": "Second generation NCU hardware",
    "releaseDate": "2025-01-01",
    "orderColumn": 10,
    "enabled": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/hardware-version-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'ncu-v2',
            'version' => '2.0.0',
            'description' => 'Second generation NCU hardware',
            'releaseDate' => '2025-01-01',
            'orderColumn' => 10,
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/hardware-version-types/unknown'
payload = {
    "slug": "ncu-v2",
    "version": "2.0.0",
    "description": "Second generation NCU hardware",
    "releaseDate": "2025-01-01",
    "orderColumn": 10,
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/hardware-version-types/{hardwareVersionType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

hardwareVersionType_slug   string   

The slug of the hardwareVersionType. Example: unknown

Body Parameters

slug   string  optional  

Hardware version slug (unique). Must not be greater than 255 characters. Example: ncu-v2

version   string  optional  

Semantic version number (e.g., 1.0, 1.0.0). Must match the regex /^\d+(.\d+){0,2}$/. Must not be greater than 50 characters. Example: 2.0.0

description   string  optional  

Optional description. Example: Second generation NCU hardware

releaseDate   string  optional  

Optional release date (YYYY-MM-DD). Must be a valid date. Example: 2025-01-01

orderColumn   integer  optional  

Optional display order. Example: 10

enabled   boolean  optional  

Enable/disable this type. Example: true

DELETE api/v1/sa/hardware-version-types/{hardwareVersionType_slug}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/hardware-version-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/hardware-version-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/hardware-version-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/hardware-version-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/hardware-version-types/{hardwareVersionType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

hardwareVersionType_slug   string   

The slug of the hardwareVersionType. Example: unknown

GET api/v1/sa/capability-types

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/capability-types?enabled=1&category=power&valueType=boolean&search=tracking&orderBy=orderColumn&direction=asc&perPage=50" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/capability-types"
);

const params = {
    "enabled": "1",
    "category": "power",
    "valueType": "boolean",
    "search": "tracking",
    "orderBy": "orderColumn",
    "direction": "asc",
    "perPage": "50",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/capability-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'enabled' => '1',
            'category' => 'power',
            'valueType' => 'boolean',
            'search' => 'tracking',
            'orderBy' => 'orderColumn',
            'direction' => 'asc',
            'perPage' => '50',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/capability-types'
params = {
  'enabled': '1',
  'category': 'power',
  'valueType': 'boolean',
  'search': 'tracking',
  'orderBy': 'orderColumn',
  'direction': 'asc',
  'perPage': '50',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/capability-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

enabled   boolean  optional  

Filter by enabled status. Example: true

category   string  optional  

Filter by capability category. Must not be greater than 100 characters. Example: power

valueType   string  optional  

Filter by value type. Example: boolean

search   string  optional  

Search by name/slug. Must not be greater than 255 characters. Example: tracking

orderBy   string  optional  

Sort field. Example: orderColumn

direction   string  optional  

Sort direction. Example: asc

perPage   integer  optional  

Items per page (max 200). Must be at least 1. Must not be greater than 200. Example: 50

POST api/v1/sa/capability-types

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/capability-types" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"wifi\",
    \"name\": \"WiFi\",
    \"description\": \"WiFi connectivity support\",
    \"valueType\": \"boolean\",
    \"defaultValue\": \"true\",
    \"category\": \"communication\",
    \"orderColumn\": 1,
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/capability-types"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "wifi",
    "name": "WiFi",
    "description": "WiFi connectivity support",
    "valueType": "boolean",
    "defaultValue": "true",
    "category": "communication",
    "orderColumn": 1,
    "enabled": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/capability-types',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'wifi',
            'name' => 'WiFi',
            'description' => 'WiFi connectivity support',
            'valueType' => 'boolean',
            'defaultValue' => 'true',
            'category' => 'communication',
            'orderColumn' => 1,
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/capability-types'
payload = {
    "slug": "wifi",
    "name": "WiFi",
    "description": "WiFi connectivity support",
    "valueType": "boolean",
    "defaultValue": "true",
    "category": "communication",
    "orderColumn": 1,
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/capability-types

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

slug   string   

Unique identifier for the capability. Must not be greater than 255 characters. Example: wifi

name   string   

Display name for the capability. Must not be greater than 255 characters. Example: WiFi

description   string  optional  

Description of the capability. Example: WiFi connectivity support

valueType   string  optional  

Type of value (boolean, integer, string, array). Example: boolean

defaultValue   string  optional  

Default value for this capability. Must not be greater than 255 characters. Example: true

category   string  optional  

Category for grouping (e.g., communication, hardware, features). Must not be greater than 100 characters. Example: communication

orderColumn   integer  optional  

Display order. Example: 1

enabled   boolean  optional  

Whether the capability is enabled. Example: true

GET api/v1/sa/capability-types/export

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/capability-types/export" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/capability-types/export"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/capability-types/export',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/capability-types/export'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/capability-types/export

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/sa/capability-types/categories

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/capability-types/categories" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/capability-types/categories"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/capability-types/categories',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/capability-types/categories'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/capability-types/categories

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/sa/capability-types/{capabilityType_slug}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/capability-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/capability-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/capability-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/capability-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/capability-types/{capabilityType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

capabilityType_slug   string   

The slug of the capabilityType. Example: unknown

PATCH api/v1/sa/capability-types/{capabilityType_slug}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/capability-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"slug\": \"supports-tracking\",
    \"name\": \"Supports tracking\",
    \"description\": \"Whether the device supports tracking mode\",
    \"valueType\": \"boolean\",
    \"defaultValue\": \"false\",
    \"category\": \"tracking\",
    \"orderColumn\": 10,
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/capability-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "slug": "supports-tracking",
    "name": "Supports tracking",
    "description": "Whether the device supports tracking mode",
    "valueType": "boolean",
    "defaultValue": "false",
    "category": "tracking",
    "orderColumn": 10,
    "enabled": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/capability-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'slug' => 'supports-tracking',
            'name' => 'Supports tracking',
            'description' => 'Whether the device supports tracking mode',
            'valueType' => 'boolean',
            'defaultValue' => 'false',
            'category' => 'tracking',
            'orderColumn' => 10,
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/capability-types/unknown'
payload = {
    "slug": "supports-tracking",
    "name": "Supports tracking",
    "description": "Whether the device supports tracking mode",
    "valueType": "boolean",
    "defaultValue": "false",
    "category": "tracking",
    "orderColumn": 10,
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/capability-types/{capabilityType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

capabilityType_slug   string   

The slug of the capabilityType. Example: unknown

Body Parameters

slug   string  optional  

Capability type slug (unique). Must not be greater than 255 characters. Example: supports-tracking

name   string  optional  

Capability display name. Must not be greater than 255 characters. Example: Supports tracking

description   string  optional  

Optional description. Example: Whether the device supports tracking mode

valueType   string  optional  

Type of the stored value. Example: boolean

defaultValue   string  optional  

Optional default value (stored as string). Must not be greater than 255 characters. Example: false

category   string  optional  

Capability category. Must not be greater than 100 characters. Example: tracking

orderColumn   integer  optional  

Optional display order. Example: 10

enabled   boolean  optional  

Enable/disable this type. Example: true

DELETE api/v1/sa/capability-types/{capabilityType_slug}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/capability-types/unknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/capability-types/unknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/capability-types/unknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/capability-types/unknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/capability-types/{capabilityType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

capabilityType_slug   string   

The slug of the capabilityType. Example: unknown

POST api/v1/sa/c/{company_slug}/device-commands/{collector_uuid}/raw

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-commands/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/raw" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"command\": {
        \"setParameter\": {
            \"key\": \"reporting_interval\",
            \"value\": 60
        }
    },
    \"ttl\": 3600
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-commands/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/raw"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "command": {
        "setParameter": {
            "key": "reporting_interval",
            "value": 60
        }
    },
    "ttl": 3600
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-commands/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/raw',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'command' => [
                'setParameter' => [
                    'key' => 'reporting_interval',
                    'value' => 60,
                ],
            ],
            'ttl' => 3600,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-commands/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/raw'
payload = {
    "command": {
        "setParameter": {
            "key": "reporting_interval",
            "value": 60
        }
    },
    "ttl": 3600
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/device-commands/{collector_uuid}/raw

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

Body Parameters

command   string   

Command payload — a string for simple commands (e.g. "restart") or an object for structured commands.

ttl   integer  optional  

Command TTL in seconds (defaults to 3600 if omitted). Must be at least 1. Example: 3600

Broadcast Parameter Update

requires authentication

Send a single MQTT broadcast command to all child TCUs of an NCU, while storing parameters locally per-child-TCU.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-commands/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/broadcast-parameters" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"parameters\": []
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-commands/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/broadcast-parameters"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "parameters": []
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-commands/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/broadcast-parameters',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'parameters' => [],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-commands/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/broadcast-parameters'
payload = {
    "parameters": []
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/device-commands/{collector_uuid}/broadcast-parameters

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

collector_uuid   string   

Example: aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa

company   string   

The slug of the company Example: soluta

collector   string   

The UUID of the NCU collector Example: sed

Body Parameters

parameters   object   

Key-value pairs of parameter slugs and their values

GET api/v1/sa/c/{company_slug}/device-groups

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/device-groups

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

POST api/v1/sa/c/{company_slug}/device-groups

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Section A Collectors\",
    \"description\": \"All collectors in section A of the farm\",
    \"targetFilters\": {
        \"deviceModelTypeSlugs\": [
            \"ncu-v2\",
            \"tcu-v1\"
        ],
        \"farmUuids\": [
            \"550e8400-e29b-41d4-a716-446655440000\"
        ],
        \"siteUuids\": [
            \"f965dfca-9ad3-3aac-bca6-314a3d2ca63b\"
        ],
        \"collectorUuids\": [
            \"4b75035a-4ac9-34d1-8276-e5fe3fc533d9\"
        ],
        \"excludeCollectorUuids\": [
            \"87c9c27d-3b5e-33aa-a451-c44e711fc4d2\"
        ]
    },
    \"collectorUuids\": [
        \"ac8acc36-da1e-35a8-b807-098a620230c2\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Section A Collectors",
    "description": "All collectors in section A of the farm",
    "targetFilters": {
        "deviceModelTypeSlugs": [
            "ncu-v2",
            "tcu-v1"
        ],
        "farmUuids": [
            "550e8400-e29b-41d4-a716-446655440000"
        ],
        "siteUuids": [
            "f965dfca-9ad3-3aac-bca6-314a3d2ca63b"
        ],
        "collectorUuids": [
            "4b75035a-4ac9-34d1-8276-e5fe3fc533d9"
        ],
        "excludeCollectorUuids": [
            "87c9c27d-3b5e-33aa-a451-c44e711fc4d2"
        ]
    },
    "collectorUuids": [
        "ac8acc36-da1e-35a8-b807-098a620230c2"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Section A Collectors',
            'description' => 'All collectors in section A of the farm',
            'targetFilters' => [
                'deviceModelTypeSlugs' => [
                    'ncu-v2',
                    'tcu-v1',
                ],
                'farmUuids' => [
                    '550e8400-e29b-41d4-a716-446655440000',
                ],
                'siteUuids' => [
                    'f965dfca-9ad3-3aac-bca6-314a3d2ca63b',
                ],
                'collectorUuids' => [
                    '4b75035a-4ac9-34d1-8276-e5fe3fc533d9',
                ],
                'excludeCollectorUuids' => [
                    '87c9c27d-3b5e-33aa-a451-c44e711fc4d2',
                ],
            ],
            'collectorUuids' => [
                'ac8acc36-da1e-35a8-b807-098a620230c2',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups'
payload = {
    "name": "Section A Collectors",
    "description": "All collectors in section A of the farm",
    "targetFilters": {
        "deviceModelTypeSlugs": [
            "ncu-v2",
            "tcu-v1"
        ],
        "farmUuids": [
            "550e8400-e29b-41d4-a716-446655440000"
        ],
        "siteUuids": [
            "f965dfca-9ad3-3aac-bca6-314a3d2ca63b"
        ],
        "collectorUuids": [
            "4b75035a-4ac9-34d1-8276-e5fe3fc533d9"
        ],
        "excludeCollectorUuids": [
            "87c9c27d-3b5e-33aa-a451-c44e711fc4d2"
        ]
    },
    "collectorUuids": [
        "ac8acc36-da1e-35a8-b807-098a620230c2"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/device-groups

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

name   string   

Device group name (unique per company). Must not be greater than 255 characters. Example: Section A Collectors

description   string  optional  

Description of the device group. Example: All collectors in section A of the farm

targetFilters   object  optional  

Filters to auto-select collectors.

deviceModelTypeSlugs   string[]  optional  

The slug of an existing record in the device_model_types table.

farmUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the farms table.

siteUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the sites table.

collectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

excludeCollectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

collectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

GET api/v1/sa/c/{company_slug}/device-groups/{deviceGroup_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/device-groups/{deviceGroup_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceGroup_uuid   string   

Example: a2f63e5f-8488-4b5f-a10e-04616e26f78d

PUT api/v1/sa/c/{company_slug}/device-groups/{deviceGroup_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Section A Collectors Updated\",
    \"description\": \"Updated collectors in section A\",
    \"targetFilters\": {
        \"deviceModelTypeSlugs\": [
            \"ncu-v2\",
            \"tcu-v1\",
            \"ncu-v3\"
        ],
        \"farmUuids\": [
            \"550e8400-e29b-41d4-a716-446655440000\",
            \"550e8400-e29b-41d4-a716-446655440001\"
        ],
        \"siteUuids\": [
            \"a4683fe9-438a-3bf7-8679-a6a24316dd06\"
        ],
        \"collectorUuids\": [
            \"6a43dd00-329f-3f22-8fe1-b2ea72d600e9\"
        ],
        \"excludeCollectorUuids\": [
            \"9224be29-9381-3756-8a3e-275cf05603a2\"
        ]
    },
    \"collectorUuids\": [
        \"f7197dd9-4487-3018-b593-72fd11cccdb1\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Section A Collectors Updated",
    "description": "Updated collectors in section A",
    "targetFilters": {
        "deviceModelTypeSlugs": [
            "ncu-v2",
            "tcu-v1",
            "ncu-v3"
        ],
        "farmUuids": [
            "550e8400-e29b-41d4-a716-446655440000",
            "550e8400-e29b-41d4-a716-446655440001"
        ],
        "siteUuids": [
            "a4683fe9-438a-3bf7-8679-a6a24316dd06"
        ],
        "collectorUuids": [
            "6a43dd00-329f-3f22-8fe1-b2ea72d600e9"
        ],
        "excludeCollectorUuids": [
            "9224be29-9381-3756-8a3e-275cf05603a2"
        ]
    },
    "collectorUuids": [
        "f7197dd9-4487-3018-b593-72fd11cccdb1"
    ]
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Section A Collectors Updated',
            'description' => 'Updated collectors in section A',
            'targetFilters' => [
                'deviceModelTypeSlugs' => [
                    'ncu-v2',
                    'tcu-v1',
                    'ncu-v3',
                ],
                'farmUuids' => [
                    '550e8400-e29b-41d4-a716-446655440000',
                    '550e8400-e29b-41d4-a716-446655440001',
                ],
                'siteUuids' => [
                    'a4683fe9-438a-3bf7-8679-a6a24316dd06',
                ],
                'collectorUuids' => [
                    '6a43dd00-329f-3f22-8fe1-b2ea72d600e9',
                ],
                'excludeCollectorUuids' => [
                    '9224be29-9381-3756-8a3e-275cf05603a2',
                ],
            ],
            'collectorUuids' => [
                'f7197dd9-4487-3018-b593-72fd11cccdb1',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d'
payload = {
    "name": "Section A Collectors Updated",
    "description": "Updated collectors in section A",
    "targetFilters": {
        "deviceModelTypeSlugs": [
            "ncu-v2",
            "tcu-v1",
            "ncu-v3"
        ],
        "farmUuids": [
            "550e8400-e29b-41d4-a716-446655440000",
            "550e8400-e29b-41d4-a716-446655440001"
        ],
        "siteUuids": [
            "a4683fe9-438a-3bf7-8679-a6a24316dd06"
        ],
        "collectorUuids": [
            "6a43dd00-329f-3f22-8fe1-b2ea72d600e9"
        ],
        "excludeCollectorUuids": [
            "9224be29-9381-3756-8a3e-275cf05603a2"
        ]
    },
    "collectorUuids": [
        "f7197dd9-4487-3018-b593-72fd11cccdb1"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/sa/c/{company_slug}/device-groups/{deviceGroup_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceGroup_uuid   string   

Example: a2f63e5f-8488-4b5f-a10e-04616e26f78d

Body Parameters

name   string  optional  

Device group name (unique per company). Must not be greater than 255 characters. Example: Section A Collectors Updated

description   string  optional  

Description of the device group. Example: Updated collectors in section A

targetFilters   object  optional  

Filters to auto-select collectors.

deviceModelTypeSlugs   string[]  optional  

The slug of an existing record in the device_model_types table.

farmUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the farms table.

siteUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the sites table.

collectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

excludeCollectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

collectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

PATCH api/v1/sa/c/{company_slug}/device-groups/{deviceGroup_uuid}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Section A Collectors Updated\",
    \"description\": \"Updated collectors in section A\",
    \"targetFilters\": {
        \"deviceModelTypeSlugs\": [
            \"ncu-v2\",
            \"tcu-v1\",
            \"ncu-v3\"
        ],
        \"farmUuids\": [
            \"550e8400-e29b-41d4-a716-446655440000\",
            \"550e8400-e29b-41d4-a716-446655440001\"
        ],
        \"siteUuids\": [
            \"8b359f57-1303-3235-b6a7-2fde0afc1d3c\"
        ],
        \"collectorUuids\": [
            \"3f5a1511-1ee5-3cdd-9bdd-e96ac8d2585f\"
        ],
        \"excludeCollectorUuids\": [
            \"998df23f-29cd-3360-93d1-3d3c3113a7f9\"
        ]
    },
    \"collectorUuids\": [
        \"3655e560-493f-39e1-8311-ebf730a73675\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Section A Collectors Updated",
    "description": "Updated collectors in section A",
    "targetFilters": {
        "deviceModelTypeSlugs": [
            "ncu-v2",
            "tcu-v1",
            "ncu-v3"
        ],
        "farmUuids": [
            "550e8400-e29b-41d4-a716-446655440000",
            "550e8400-e29b-41d4-a716-446655440001"
        ],
        "siteUuids": [
            "8b359f57-1303-3235-b6a7-2fde0afc1d3c"
        ],
        "collectorUuids": [
            "3f5a1511-1ee5-3cdd-9bdd-e96ac8d2585f"
        ],
        "excludeCollectorUuids": [
            "998df23f-29cd-3360-93d1-3d3c3113a7f9"
        ]
    },
    "collectorUuids": [
        "3655e560-493f-39e1-8311-ebf730a73675"
    ]
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Section A Collectors Updated',
            'description' => 'Updated collectors in section A',
            'targetFilters' => [
                'deviceModelTypeSlugs' => [
                    'ncu-v2',
                    'tcu-v1',
                    'ncu-v3',
                ],
                'farmUuids' => [
                    '550e8400-e29b-41d4-a716-446655440000',
                    '550e8400-e29b-41d4-a716-446655440001',
                ],
                'siteUuids' => [
                    '8b359f57-1303-3235-b6a7-2fde0afc1d3c',
                ],
                'collectorUuids' => [
                    '3f5a1511-1ee5-3cdd-9bdd-e96ac8d2585f',
                ],
                'excludeCollectorUuids' => [
                    '998df23f-29cd-3360-93d1-3d3c3113a7f9',
                ],
            ],
            'collectorUuids' => [
                '3655e560-493f-39e1-8311-ebf730a73675',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d'
payload = {
    "name": "Section A Collectors Updated",
    "description": "Updated collectors in section A",
    "targetFilters": {
        "deviceModelTypeSlugs": [
            "ncu-v2",
            "tcu-v1",
            "ncu-v3"
        ],
        "farmUuids": [
            "550e8400-e29b-41d4-a716-446655440000",
            "550e8400-e29b-41d4-a716-446655440001"
        ],
        "siteUuids": [
            "8b359f57-1303-3235-b6a7-2fde0afc1d3c"
        ],
        "collectorUuids": [
            "3f5a1511-1ee5-3cdd-9bdd-e96ac8d2585f"
        ],
        "excludeCollectorUuids": [
            "998df23f-29cd-3360-93d1-3d3c3113a7f9"
        ]
    },
    "collectorUuids": [
        "3655e560-493f-39e1-8311-ebf730a73675"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/c/{company_slug}/device-groups/{deviceGroup_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceGroup_uuid   string   

Example: a2f63e5f-8488-4b5f-a10e-04616e26f78d

Body Parameters

name   string  optional  

Device group name (unique per company). Must not be greater than 255 characters. Example: Section A Collectors Updated

description   string  optional  

Description of the device group. Example: Updated collectors in section A

targetFilters   object  optional  

Filters to auto-select collectors.

deviceModelTypeSlugs   string[]  optional  

The slug of an existing record in the device_model_types table.

farmUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the farms table.

siteUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the sites table.

collectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

excludeCollectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

collectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

POST api/v1/sa/c/{company_slug}/device-groups/{deviceGroup_uuid}/collectors

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d/collectors" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"action\": \"add\",
    \"collectorUuids\": [
        \"333b9775-74a2-3052-8116-932b53b86bc7\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d/collectors"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "action": "add",
    "collectorUuids": [
        "333b9775-74a2-3052-8116-932b53b86bc7"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d/collectors',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'action' => 'add',
            'collectorUuids' => [
                '333b9775-74a2-3052-8116-932b53b86bc7',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d/collectors'
payload = {
    "action": "add",
    "collectorUuids": [
        "333b9775-74a2-3052-8116-932b53b86bc7"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/device-groups/{deviceGroup_uuid}/collectors

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceGroup_uuid   string   

Example: a2f63e5f-8488-4b5f-a10e-04616e26f78d

Body Parameters

action   string   

Action to perform: add or remove collectors. Example: add

collectorUuids   string[]  optional  

Must be a valid UUID. The uuid of an existing record in the collectors table.

DELETE api/v1/sa/c/{company_slug}/device-groups/{deviceGroup_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}/device-groups/{deviceGroup_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceGroup_uuid   string   

Example: a2f63e5f-8488-4b5f-a10e-04616e26f78d

POST api/v1/sa/c/{company_slug}/device-groups/{deviceGroup_uuid}/parameters

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d/parameters" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"parameters\": [
        \"tempore\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d/parameters"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "parameters": [
        "tempore"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d/parameters',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'parameters' => [
                'tempore',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/device-groups/a2f63e5f-8488-4b5f-a10e-04616e26f78d/parameters'
payload = {
    "parameters": [
        "tempore"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/device-groups/{deviceGroup_uuid}/parameters

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

deviceGroup_uuid   string   

Example: a2f63e5f-8488-4b5f-a10e-04616e26f78d

Body Parameters

parameters   string[]   

List all document library sections.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/doc-lib/sections" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/doc-lib/sections

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Create a new document library section.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Technical Manuals\",
    \"description\": \"Technical documentation and user manuals for all product lines.\",
    \"enabled\": false
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Technical Manuals",
    "description": "Technical documentation and user manuals for all product lines.",
    "enabled": false
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Technical Manuals',
            'description' => 'Technical documentation and user manuals for all product lines.',
            'enabled' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections'
payload = {
    "name": "Technical Manuals",
    "description": "Technical documentation and user manuals for all product lines.",
    "enabled": false
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/doc-lib/sections

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

name   string   

The name of the document library section. Must not be greater than 255 characters. Example: Technical Manuals

description   string  optional  

An optional description of the section. Must not be greater than 1000 characters. Example: Technical documentation and user manuals for all product lines.

enabled   boolean  optional  

Example: false

Update an existing document library section.

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Technical Manuals\",
    \"description\": \"Technical documentation and user manuals for all product lines.\",
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Technical Manuals",
    "description": "Technical documentation and user manuals for all product lines.",
    "enabled": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Technical Manuals',
            'description' => 'Technical documentation and user manuals for all product lines.',
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3'
payload = {
    "name": "Technical Manuals",
    "description": "Technical documentation and user manuals for all product lines.",
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/doc-lib/sections/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

Body Parameters

name   string   

The updated name of the section. Must not be greater than 255 characters. Example: Technical Manuals

description   string  optional  

The updated description of the section. Must not be greater than 1000 characters. Example: Technical documentation and user manuals for all product lines.

enabled   boolean  optional  

Example: true

Delete a document library section.

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/doc-lib/sections/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

Upload an icon image for a section.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/icon" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"file\": \"modi\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/icon"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "file": "modi"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/icon',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'file' => 'modi',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/icon'
payload = {
    "file": "modi"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/doc-lib/sections/{section_uuid}/icon

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

Body Parameters

file   string   

The image file to upload as the section icon (max 5MB). Example: modi

Remove the icon from a section.

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/icon" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/icon"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/icon',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/icon'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/doc-lib/sections/{section_uuid}/icon

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

Reorder document library sections.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/reorder" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"orderedUuids\": [
        \"7ce2d232-a8f8-347c-a2df-9a70a29e897c\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/reorder"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "orderedUuids": [
        "7ce2d232-a8f8-347c-a2df-9a70a29e897c"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/reorder',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'orderedUuids' => [
                '7ce2d232-a8f8-347c-a2df-9a70a29e897c',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/reorder'
payload = {
    "orderedUuids": [
        "7ce2d232-a8f8-347c-a2df-9a70a29e897c"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/doc-lib/sections/reorder

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

orderedUuids   string[]   

Must be a valid UUID.

List all categories for a section.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/doc-lib/sections/{section_uuid}/categories

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

Create a new category within a section.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Installation Guides\",
    \"description\": \"Step-by-step installation guides for field technicians.\",
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Installation Guides",
    "description": "Step-by-step installation guides for field technicians.",
    "enabled": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Installation Guides',
            'description' => 'Step-by-step installation guides for field technicians.',
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories'
payload = {
    "name": "Installation Guides",
    "description": "Step-by-step installation guides for field technicians.",
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/doc-lib/sections/{section_uuid}/categories

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

Body Parameters

name   string   

The name of the category. Must not be greater than 255 characters. Example: Installation Guides

description   string  optional  

An optional description of the category. Must not be greater than 1000 characters. Example: Step-by-step installation guides for field technicians.

enabled   boolean  optional  

Example: true

Update an existing category.

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Installation Guides\",
    \"description\": \"Step-by-step installation guides for field technicians.\",
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Installation Guides",
    "description": "Step-by-step installation guides for field technicians.",
    "enabled": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Installation Guides',
            'description' => 'Step-by-step installation guides for field technicians.',
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd'
payload = {
    "name": "Installation Guides",
    "description": "Step-by-step installation guides for field technicians.",
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/doc-lib/sections/{section_uuid}/categories/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

uuid   string   

Example: 6d8ce9e4-ee38-432f-b75b-6834ef1d21bd

Body Parameters

name   string   

The updated name of the category. Must not be greater than 255 characters. Example: Installation Guides

description   string  optional  

The updated description of the category. Must not be greater than 1000 characters. Example: Step-by-step installation guides for field technicians.

enabled   boolean  optional  

Example: true

Delete a category.

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/doc-lib/sections/{section_uuid}/categories/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

uuid   string   

Example: 6d8ce9e4-ee38-432f-b75b-6834ef1d21bd

Upload an icon image for a category.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/icon" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"file\": \"excepturi\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/icon"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "file": "excepturi"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/icon',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'file' => 'excepturi',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/icon'
payload = {
    "file": "excepturi"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/doc-lib/sections/{section_uuid}/categories/{category_uuid}/icon

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

category_uuid   string   

Example: 6d8ce9e4-ee38-432f-b75b-6834ef1d21bd

Body Parameters

file   string   

The image file to upload as the section icon (max 5MB). Example: excepturi

Remove the icon from a category.

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/icon" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/icon"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/icon',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/icon'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/doc-lib/sections/{section_uuid}/categories/{category_uuid}/icon

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

category_uuid   string   

Example: 6d8ce9e4-ee38-432f-b75b-6834ef1d21bd

Reorder categories within a section.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/reorder" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"orderedUuids\": [
        \"86f07b5d-baf1-345f-b6ad-1e546ea72580\"
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/reorder"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "orderedUuids": [
        "86f07b5d-baf1-345f-b6ad-1e546ea72580"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/reorder',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'orderedUuids' => [
                '86f07b5d-baf1-345f-b6ad-1e546ea72580',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/reorder'
payload = {
    "orderedUuids": [
        "86f07b5d-baf1-345f-b6ad-1e546ea72580"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/doc-lib/sections/{section_uuid}/categories/reorder

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

Body Parameters

orderedUuids   string[]   

Must be a valid UUID.

Move a category to a different section.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/move" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"sectionUuid\": \"550e8400-e29b-41d4-a716-446655440000\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/move"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "sectionUuid": "550e8400-e29b-41d4-a716-446655440000"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/move',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'sectionUuid' => '550e8400-e29b-41d4-a716-446655440000',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/move'
payload = {
    "sectionUuid": "550e8400-e29b-41d4-a716-446655440000"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/doc-lib/sections/{section_uuid}/categories/{category_uuid}/move

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

category_uuid   string   

Example: 6d8ce9e4-ee38-432f-b75b-6834ef1d21bd

Body Parameters

sectionUuid   string   

The UUID of the target section to move the category to. Must be a valid UUID. The uuid of an existing record in the document_section table. Example: 550e8400-e29b-41d4-a716-446655440000

List all documents for a category.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/doc-lib/sections/{section_uuid}/categories/{category_uuid}/documents

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

category_uuid   string   

Example: 6d8ce9e4-ee38-432f-b75b-6834ef1d21bd

Upload a new document into a category.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "name=NCU Installation Manual v2.1" \
    --form "description=Complete installation and commissioning guide for NCU v2 units." \
    --form "enabled=1" \
    --form "file=@/tmp/phpvjhh689jbvdceUP4ipw" 
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('name', 'NCU Installation Manual v2.1');
body.append('description', 'Complete installation and commissioning guide for NCU v2 units.');
body.append('enabled', '1');
body.append('file', document.querySelector('input[name="file"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'name',
                'contents' => 'NCU Installation Manual v2.1'
            ],
            [
                'name' => 'description',
                'contents' => 'Complete installation and commissioning guide for NCU v2 units.'
            ],
            [
                'name' => 'enabled',
                'contents' => '1'
            ],
            [
                'name' => 'file',
                'contents' => fopen('/tmp/phpvjhh689jbvdceUP4ipw', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents'
files = {
  'file': open('/tmp/phpvjhh689jbvdceUP4ipw', 'rb')
}
payload = {
    "name": "NCU Installation Manual v2.1",
    "description": "Complete installation and commissioning guide for NCU v2 units.",
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'multipart/form-data',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, files=files, data=payload)
response.json()

Request      

POST api/v1/sa/doc-lib/sections/{section_uuid}/categories/{category_uuid}/documents

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: multipart/form-data

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

category_uuid   string   

Example: 6d8ce9e4-ee38-432f-b75b-6834ef1d21bd

Body Parameters

file   file   

The document file to upload (max 64MB). Must be a file. Must not be greater than 65536 kilobytes. Example: /tmp/phpvjhh689jbvdceUP4ipw

name   string   

The display name of the document. Must not be greater than 255 characters. Example: NCU Installation Manual v2.1

description   string  optional  

An optional description of the document. Must not be greater than 2000 characters. Example: Complete installation and commissioning guide for NCU v2 units.

enabled   boolean  optional  

Whether the document is visible to non-SA users. Defaults to true. Example: true

Upload an icon image for a document record.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/icon" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"file\": \"aut\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/icon"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "file": "aut"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/icon',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'file' => 'aut',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/icon'
payload = {
    "file": "aut"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/doc-lib/sections/{section_uuid}/categories/{category_uuid}/documents/{documentSectionDocument_uuid}/icon

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

category_uuid   string   

Example: 6d8ce9e4-ee38-432f-b75b-6834ef1d21bd

documentSectionDocument_uuid   string   

Example: ccee35e3-6359-4d97-80cc-bca275fc26cf

Body Parameters

file   string   

The image file to upload as the section icon (max 5MB). Example: aut

Remove the icon from a document record.

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/icon" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/icon"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/icon',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/icon'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/doc-lib/sections/{section_uuid}/categories/{category_uuid}/documents/{documentSectionDocument_uuid}/icon

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

category_uuid   string   

Example: 6d8ce9e4-ee38-432f-b75b-6834ef1d21bd

documentSectionDocument_uuid   string   

Example: ccee35e3-6359-4d97-80cc-bca275fc26cf

Update document metadata.

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"NCU Installation Manual v2.1\",
    \"description\": \"Complete installation and commissioning guide for NCU v2 units.\",
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "NCU Installation Manual v2.1",
    "description": "Complete installation and commissioning guide for NCU v2 units.",
    "enabled": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'NCU Installation Manual v2.1',
            'description' => 'Complete installation and commissioning guide for NCU v2 units.',
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf'
payload = {
    "name": "NCU Installation Manual v2.1",
    "description": "Complete installation and commissioning guide for NCU v2 units.",
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/doc-lib/sections/{section_uuid}/categories/{category_uuid}/documents/{documentSectionDocument_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

category_uuid   string   

Example: 6d8ce9e4-ee38-432f-b75b-6834ef1d21bd

documentSectionDocument_uuid   string   

Example: ccee35e3-6359-4d97-80cc-bca275fc26cf

Body Parameters

name   string   

The updated display name of the document. Must not be greater than 255 characters. Example: NCU Installation Manual v2.1

description   string  optional  

The updated description of the document. Must not be greater than 2000 characters. Example: Complete installation and commissioning guide for NCU v2 units.

enabled   boolean  optional  

Whether the document is visible to non-SA users. Example: true

Delete a document.

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/doc-lib/sections/{section_uuid}/categories/{category_uuid}/documents/{documentSectionDocument_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

category_uuid   string   

Example: 6d8ce9e4-ee38-432f-b75b-6834ef1d21bd

documentSectionDocument_uuid   string   

Example: ccee35e3-6359-4d97-80cc-bca275fc26cf

Move a document to a different category.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/move" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"categoryUuid\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/move"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "categoryUuid": "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/move',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'categoryUuid' => '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/doc-lib/sections/6218f665-ccd0-417e-917a-faecaa225bc3/categories/6d8ce9e4-ee38-432f-b75b-6834ef1d21bd/documents/ccee35e3-6359-4d97-80cc-bca275fc26cf/move'
payload = {
    "categoryUuid": "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/doc-lib/sections/{section_uuid}/categories/{category_uuid}/documents/{documentSectionDocument_uuid}/move

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

section_uuid   string   

Example: 6218f665-ccd0-417e-917a-faecaa225bc3

category_uuid   string   

Example: 6d8ce9e4-ee38-432f-b75b-6834ef1d21bd

documentSectionDocument_uuid   string   

Example: ccee35e3-6359-4d97-80cc-bca275fc26cf

Body Parameters

categoryUuid   string   

The UUID of the target category to move the document to. Must be a valid UUID. The uuid of an existing record in the document_section_category table. Example: 6ba7b810-9dad-11d1-80b4-00c04fd430c8

GET api/v1/sa/companies/{company_slug}/firmware-keys

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/companies/{company_slug}/firmware-keys

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

POST api/v1/sa/companies/{company_slug}/firmware-keys

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Production Farm Key\",
    \"description\": \"Key for firmware updates on production farm\",
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440000\",
    \"expiresAt\": \"2025-12-31\",
    \"isActive\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Production Farm Key",
    "description": "Key for firmware updates on production farm",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440000",
    "expiresAt": "2025-12-31",
    "isActive": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Production Farm Key',
            'description' => 'Key for firmware updates on production farm',
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'expiresAt' => '2025-12-31',
            'isActive' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys'
payload = {
    "name": "Production Farm Key",
    "description": "Key for firmware updates on production farm",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440000",
    "expiresAt": "2025-12-31",
    "isActive": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/companies/{company_slug}/firmware-keys

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

name   string   

Name for the firmware access key. Must not be greater than 255 characters. Example: Production Farm Key

description   string  optional  

Description of the key purpose. Example: Key for firmware updates on production farm

farmUuid   string   

UUID of the farm to create the key for. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

expiresAt   string  optional  

Expiration date for the key. Must be a valid date. Example: 2025-12-31

isActive   boolean  optional  

Whether the key is active. Example: true

GET api/v1/sa/companies/{company_slug}/firmware-keys/{firmwareAccessKey_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/companies/{company_slug}/firmware-keys/{firmwareAccessKey_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

firmwareAccessKey_uuid   string   

Example: f2c02d5b-8653-47d4-b315-5d073c2da271

PUT api/v1/sa/companies/{company_slug}/firmware-keys/{firmwareAccessKey_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Updated Farm Key\",
    \"description\": \"Updated key description\",
    \"expiresAt\": \"2026-06-30\",
    \"isActive\": false
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Updated Farm Key",
    "description": "Updated key description",
    "expiresAt": "2026-06-30",
    "isActive": false
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Updated Farm Key',
            'description' => 'Updated key description',
            'expiresAt' => '2026-06-30',
            'isActive' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271'
payload = {
    "name": "Updated Farm Key",
    "description": "Updated key description",
    "expiresAt": "2026-06-30",
    "isActive": false
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/sa/companies/{company_slug}/firmware-keys/{firmwareAccessKey_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

firmwareAccessKey_uuid   string   

Example: f2c02d5b-8653-47d4-b315-5d073c2da271

Body Parameters

name   string  optional  

Name for the firmware access key. Must not be greater than 255 characters. Example: Updated Farm Key

description   string  optional  

Description of the key purpose. Example: Updated key description

expiresAt   string  optional  

Expiration date for the key. Must be a valid date. Example: 2026-06-30

isActive   boolean  optional  

Whether the key is active. Example: false

PUT api/v1/sa/companies/{company_slug}/firmware-keys/{firmwareAccessKey_uuid}/deactivate

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271/deactivate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271/deactivate"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271/deactivate',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/companies/tracklab/firmware-keys/f2c02d5b-8653-47d4-b315-5d073c2da271/deactivate'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers)
response.json()

Request      

PUT api/v1/sa/companies/{company_slug}/firmware-keys/{firmwareAccessKey_uuid}/deactivate

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

firmwareAccessKey_uuid   string   

Example: f2c02d5b-8653-47d4-b315-5d073c2da271

List available firmware versions (global scope)

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/firmware" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"deviceModelTypeSlug\": \"ncu-v2\",
    \"enabled\": true,
    \"perPage\": 25
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/firmware"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "deviceModelTypeSlug": "ncu-v2",
    "enabled": true,
    "perPage": 25
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/firmware',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'deviceModelTypeSlug' => 'ncu-v2',
            'enabled' => true,
            'perPage' => 25,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/firmware'
payload = {
    "deviceModelTypeSlug": "ncu-v2",
    "enabled": true,
    "perPage": 25
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/firmware

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

deviceModelTypeSlug   string  optional  

Filter by device model type slug. The slug of an existing record in the device_model_types table. Example: ncu-v2

enabled   boolean  optional  

Filter by enabled status. Example: true

perPage   integer  optional  

Number of records per page (1-100). Must be at least 1. Must not be greater than 100. Example: 25

Upload new firmware

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/firmware" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "version=v1.2.3" \
    --form "deviceModelTypeSlug=ncu-v2" \
    --form "name=NCU Firmware v1.2.3" \
    --form "description=Bug fixes and performance improvements" \
    --form "file=@/site/web/resources/scribe/fixtures/firmware.bin" 
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/firmware"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('version', 'v1.2.3');
body.append('deviceModelTypeSlug', 'ncu-v2');
body.append('name', 'NCU Firmware v1.2.3');
body.append('description', 'Bug fixes and performance improvements');
body.append('file', document.querySelector('input[name="file"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/firmware',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'version',
                'contents' => 'v1.2.3'
            ],
            [
                'name' => 'deviceModelTypeSlug',
                'contents' => 'ncu-v2'
            ],
            [
                'name' => 'name',
                'contents' => 'NCU Firmware v1.2.3'
            ],
            [
                'name' => 'description',
                'contents' => 'Bug fixes and performance improvements'
            ],
            [
                'name' => 'file',
                'contents' => fopen('/site/web/resources/scribe/fixtures/firmware.bin', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/firmware'
files = {
  'file': open('/site/web/resources/scribe/fixtures/firmware.bin', 'rb')
}
payload = {
    "version": "v1.2.3",
    "deviceModelTypeSlug": "ncu-v2",
    "name": "NCU Firmware v1.2.3",
    "description": "Bug fixes and performance improvements"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'multipart/form-data',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, files=files, data=payload)
response.json()

Request      

POST api/v1/sa/firmware

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: multipart/form-data

Accept      

Example: application/json

Body Parameters

file   file   

The firmware binary file (max 100MB). Must be a file. Must not be greater than 102400 kilobytes. Example: /site/web/resources/scribe/fixtures/firmware.bin

version   string   

Semantic version of the firmware. Must match the regex /^v?\d+.\d+.\d+(?:-[0-9A-Za-z.-]+)?(?:+[0-9A-Za-z.-]+)?$/. Must not be greater than 50 characters. Example: v1.2.3

deviceModelTypeSlug   string  optional  

Slug of the target device model type. The slug of an existing record in the device_model_types table. Example: ncu-v2

name   string  optional  

Display name for the firmware. Must not be greater than 255 characters. Example: NCU Firmware v1.2.3

description   string  optional  

Description of the firmware release. Must not be greater than 1000 characters. Example: Bug fixes and performance improvements

Show firmware details

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/firmware/nknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/firmware/nknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/firmware/nknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/firmware/nknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/firmware/{slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

slug   string   

The slug of the firmware. Example: nknown

Update firmware metadata

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/sa/firmware/nknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"tokenRequired\": false,
    \"name\": \"qlqbdpfwylgxl\",
    \"description\": \"Est est quo enim autem reprehenderit.\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/firmware/nknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "tokenRequired": false,
    "name": "qlqbdpfwylgxl",
    "description": "Est est quo enim autem reprehenderit."
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/sa/firmware/nknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'tokenRequired' => false,
            'name' => 'qlqbdpfwylgxl',
            'description' => 'Est est quo enim autem reprehenderit.',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/firmware/nknown'
payload = {
    "tokenRequired": false,
    "name": "qlqbdpfwylgxl",
    "description": "Est est quo enim autem reprehenderit."
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/sa/firmware/{slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

slug   string   

The slug of the firmware. Example: nknown

Body Parameters

tokenRequired   boolean  optional  

Example: false

name   string  optional  

Must not be greater than 255 characters. Example: qlqbdpfwylgxl

description   string  optional  

Must not be greater than 1000 characters. Example: Est est quo enim autem reprehenderit.

Enable/disable firmware

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/sa/firmware/nknown/toggle" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"enabled\": false
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/firmware/nknown/toggle"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "enabled": false
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/sa/firmware/nknown/toggle',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'enabled' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/firmware/nknown/toggle'
payload = {
    "enabled": false
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/sa/firmware/{firmware_slug}/toggle

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

firmware_slug   string   

The slug of the firmware. Example: nknown

Body Parameters

enabled   boolean   

Example: false

Delete firmware (soft delete)

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/firmware/nknown" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/firmware/nknown"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/firmware/nknown',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/firmware/nknown'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/firmware/{slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

slug   string   

The slug of the firmware. Example: nknown

GET api/v1/sa/c/{company_slug}/notification-channels

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/notification-channels

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

POST api/v1/sa/c/{company_slug}/notification-channels

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"companySlug\": \"acme-solar\",
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440111\",
    \"notificationChannelType\": \"email\",
    \"name\": \"Ops Email Alerts\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "companySlug": "acme-solar",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440111",
    "notificationChannelType": "email",
    "name": "Ops Email Alerts"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'companySlug' => 'acme-solar',
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440111',
            'notificationChannelType' => 'email',
            'name' => 'Ops Email Alerts',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels'
payload = {
    "companySlug": "acme-solar",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440111",
    "notificationChannelType": "email",
    "name": "Ops Email Alerts"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/notification-channels

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

companySlug   string   

Company slug for this channel. The slug of an existing record in the companies table. Example: acme-solar

farmUuid   string  optional  

Optional farm UUID for farm-scoped channels. Must be a valid UUID. The uuid of an existing record in the farms table. Example: 550e8400-e29b-41d4-a716-446655440111

notificationChannelType   string   

Notification channel type slug. The slug of an existing record in the notification_channel_types table. Example: email

name   string   

Display name of the notification channel. Must not be greater than 255 characters. Example: Ops Email Alerts

GET api/v1/sa/c/{company_slug}/notification-channels/{notificationChannel_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/7f7c4196-264c-34bd-a8b9-d4d45d374030" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/7f7c4196-264c-34bd-a8b9-d4d45d374030"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/7f7c4196-264c-34bd-a8b9-d4d45d374030',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/7f7c4196-264c-34bd-a8b9-d4d45d374030'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/notification-channels/{notificationChannel_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannel_uuid   string   

Example: 7f7c4196-264c-34bd-a8b9-d4d45d374030

PUT api/v1/sa/c/{company_slug}/notification-channels/{notificationChannel_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/f8be940e-f6fc-3b43-baef-499cf9b23eb3" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"notificationChannelType\": \"email\",
    \"name\": \"Operations Alerts\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/f8be940e-f6fc-3b43-baef-499cf9b23eb3"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "notificationChannelType": "email",
    "name": "Operations Alerts"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/f8be940e-f6fc-3b43-baef-499cf9b23eb3',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'notificationChannelType' => 'email',
            'name' => 'Operations Alerts',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/f8be940e-f6fc-3b43-baef-499cf9b23eb3'
payload = {
    "notificationChannelType": "email",
    "name": "Operations Alerts"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/sa/c/{company_slug}/notification-channels/{notificationChannel_uuid}

PATCH api/v1/sa/c/{company_slug}/notification-channels/{notificationChannel_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannel_uuid   string   

Example: f8be940e-f6fc-3b43-baef-499cf9b23eb3

Body Parameters

notificationChannelType   string  optional  

Notification channel type slug. The slug of an existing record in the notification_channel_types table. Example: email

name   string  optional  

Display name of the notification channel. Must not be greater than 255 characters. Example: Operations Alerts

DELETE api/v1/sa/c/{company_slug}/notification-channels/{notificationChannel_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/597a04bc-ab5e-374b-9cdd-03f2c3746577" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/597a04bc-ab5e-374b-9cdd-03f2c3746577"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/597a04bc-ab5e-374b-9cdd-03f2c3746577',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/597a04bc-ab5e-374b-9cdd-03f2c3746577'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}/notification-channels/{notificationChannel_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannel_uuid   string   

Example: 597a04bc-ab5e-374b-9cdd-03f2c3746577

POST api/v1/sa/c/{company_slug}/notification-channels/{notificationChannel_uuid}/emails

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/f7a32869-a0aa-3e1e-8d47-63f2b0475265/emails" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"emailAddress\": \"alerts@example.com\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/f7a32869-a0aa-3e1e-8d47-63f2b0475265/emails"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "emailAddress": "alerts@example.com"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/f7a32869-a0aa-3e1e-8d47-63f2b0475265/emails',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'emailAddress' => 'alerts@example.com',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/f7a32869-a0aa-3e1e-8d47-63f2b0475265/emails'
payload = {
    "emailAddress": "alerts@example.com"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/notification-channels/{notificationChannel_uuid}/emails

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannel_uuid   string   

Example: f7a32869-a0aa-3e1e-8d47-63f2b0475265

Body Parameters

emailAddress   string   

Email address to receive notifications. Must be a valid email address. Must not be greater than 255 characters. Example: alerts@example.com

POST api/v1/sa/c/{company_slug}/notification-channels/{notificationChannel_uuid}/push-devices

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/122221c6-5ee2-3083-b1f5-fec96c8f9292/push-devices" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"mobileDeviceUuid\": \"550e8400-e29b-41d4-a716-446655440000\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/122221c6-5ee2-3083-b1f5-fec96c8f9292/push-devices"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "mobileDeviceUuid": "550e8400-e29b-41d4-a716-446655440000"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/122221c6-5ee2-3083-b1f5-fec96c8f9292/push-devices',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'mobileDeviceUuid' => '550e8400-e29b-41d4-a716-446655440000',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/122221c6-5ee2-3083-b1f5-fec96c8f9292/push-devices'
payload = {
    "mobileDeviceUuid": "550e8400-e29b-41d4-a716-446655440000"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/notification-channels/{notificationChannel_uuid}/push-devices

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannel_uuid   string   

Example: 122221c6-5ee2-3083-b1f5-fec96c8f9292

Body Parameters

mobileDeviceUuid   string   

UUID of the mobile device to link for push notifications. Must be a valid UUID. The uuid of an existing record in the mobile_devices table. Example: 550e8400-e29b-41d4-a716-446655440000

POST api/v1/sa/c/{company_slug}/notification-channels/{notificationChannel_uuid}/webhooks

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/4bc73de7-ecf3-3214-a190-785074365fac/webhooks" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"PagerDuty Webhook\",
    \"url\": \"https:\\/\\/hooks.example.com\\/alerts\",
    \"httpMethod\": \"POST\",
    \"timeoutSeconds\": 30
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/4bc73de7-ecf3-3214-a190-785074365fac/webhooks"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "PagerDuty Webhook",
    "url": "https:\/\/hooks.example.com\/alerts",
    "httpMethod": "POST",
    "timeoutSeconds": 30
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/4bc73de7-ecf3-3214-a190-785074365fac/webhooks',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'PagerDuty Webhook',
            'url' => 'https://hooks.example.com/alerts',
            'httpMethod' => 'POST',
            'timeoutSeconds' => 30,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channels/4bc73de7-ecf3-3214-a190-785074365fac/webhooks'
payload = {
    "name": "PagerDuty Webhook",
    "url": "https:\/\/hooks.example.com\/alerts",
    "httpMethod": "POST",
    "timeoutSeconds": 30
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/notification-channels/{notificationChannel_uuid}/webhooks

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannel_uuid   string   

Example: 4bc73de7-ecf3-3214-a190-785074365fac

Body Parameters

name   string   

Webhook name. Must not be greater than 255 characters. Example: PagerDuty Webhook

url   string   

Webhook URL endpoint. Must be a valid URL. Must not be greater than 2048 characters. Example: https://hooks.example.com/alerts

httpMethod   string  optional  

HTTP method used for webhook delivery. Example: POST

timeoutSeconds   integer  optional  

Webhook timeout in seconds. Must be at least 1. Must not be greater than 120. Example: 30

DELETE api/v1/sa/c/{company_slug}/notification-channel-emails/{notificationChannelEmail_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-emails/72f3e884-55a6-3542-93e9-62ceaac23f28" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-emails/72f3e884-55a6-3542-93e9-62ceaac23f28"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-emails/72f3e884-55a6-3542-93e9-62ceaac23f28',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-emails/72f3e884-55a6-3542-93e9-62ceaac23f28'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}/notification-channel-emails/{notificationChannelEmail_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannelEmail_uuid   string   

Example: 72f3e884-55a6-3542-93e9-62ceaac23f28

DELETE api/v1/sa/c/{company_slug}/notification-channel-push-devices/{notificationChannelPushDevice_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-push-devices/dd55949e-a728-3bda-b5ec-6e022d4a7fb0" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-push-devices/dd55949e-a728-3bda-b5ec-6e022d4a7fb0"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-push-devices/dd55949e-a728-3bda-b5ec-6e022d4a7fb0',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-push-devices/dd55949e-a728-3bda-b5ec-6e022d4a7fb0'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}/notification-channel-push-devices/{notificationChannelPushDevice_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannelPushDevice_uuid   string   

Example: dd55949e-a728-3bda-b5ec-6e022d4a7fb0

PUT api/v1/sa/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhooks/3ce25307-2dbc-33be-bb66-585139140664" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"PagerDuty Webhook\",
    \"url\": \"https:\\/\\/hooks.example.com\\/alerts\",
    \"httpMethod\": \"PATCH\",
    \"timeoutSeconds\": 20
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhooks/3ce25307-2dbc-33be-bb66-585139140664"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "PagerDuty Webhook",
    "url": "https:\/\/hooks.example.com\/alerts",
    "httpMethod": "PATCH",
    "timeoutSeconds": 20
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhooks/3ce25307-2dbc-33be-bb66-585139140664',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'PagerDuty Webhook',
            'url' => 'https://hooks.example.com/alerts',
            'httpMethod' => 'PATCH',
            'timeoutSeconds' => 20,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhooks/3ce25307-2dbc-33be-bb66-585139140664'
payload = {
    "name": "PagerDuty Webhook",
    "url": "https:\/\/hooks.example.com\/alerts",
    "httpMethod": "PATCH",
    "timeoutSeconds": 20
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/sa/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}

PATCH api/v1/sa/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannelWebhook_uuid   string   

Example: 3ce25307-2dbc-33be-bb66-585139140664

Body Parameters

name   string  optional  

Webhook name. Must not be greater than 255 characters. Example: PagerDuty Webhook

url   string  optional  

Webhook URL endpoint. Must be a valid URL. Must not be greater than 2048 characters. Example: https://hooks.example.com/alerts

httpMethod   string  optional  

HTTP method used for webhook delivery. Example: PATCH

timeoutSeconds   integer  optional  

Webhook timeout in seconds. Must be at least 1. Must not be greater than 120. Example: 20

DELETE api/v1/sa/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhooks/e847cb8d-b274-3d99-973b-f0e8669601e5" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhooks/e847cb8d-b274-3d99-973b-f0e8669601e5"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhooks/e847cb8d-b274-3d99-973b-f0e8669601e5',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhooks/e847cb8d-b274-3d99-973b-f0e8669601e5'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannelWebhook_uuid   string   

Example: e847cb8d-b274-3d99-973b-f0e8669601e5

POST api/v1/sa/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}/headers

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhooks/54f30de0-9716-38f8-bb64-d32a76684236/headers" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"headerKey\": \"X-Signature\",
    \"headerValue\": \"secret-token\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhooks/54f30de0-9716-38f8-bb64-d32a76684236/headers"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "headerKey": "X-Signature",
    "headerValue": "secret-token"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhooks/54f30de0-9716-38f8-bb64-d32a76684236/headers',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'headerKey' => 'X-Signature',
            'headerValue' => 'secret-token',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhooks/54f30de0-9716-38f8-bb64-d32a76684236/headers'
payload = {
    "headerKey": "X-Signature",
    "headerValue": "secret-token"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/notification-channel-webhooks/{notificationChannelWebhook_uuid}/headers

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannelWebhook_uuid   string   

Example: 54f30de0-9716-38f8-bb64-d32a76684236

Body Parameters

headerKey   string   

Webhook header key. Must not be greater than 255 characters. Example: X-Signature

headerValue   string   

Webhook header value. Must not be greater than 1000 characters. Example: secret-token

DELETE api/v1/sa/c/{company_slug}/notification-channel-webhook-headers/{notificationChannelWebhookHeader_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhook-headers/ea780eed-d501-3e67-98da-27887be0ccf5" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhook-headers/ea780eed-d501-3e67-98da-27887be0ccf5"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhook-headers/ea780eed-d501-3e67-98da-27887be0ccf5',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-channel-webhook-headers/ea780eed-d501-3e67-98da-27887be0ccf5'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}/notification-channel-webhook-headers/{notificationChannelWebhookHeader_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationChannelWebhookHeader_uuid   string   

Example: ea780eed-d501-3e67-98da-27887be0ccf5

GET api/v1/sa/notification-templates

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/notification-templates" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/notification-templates"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/notification-templates',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/notification-templates'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/notification-templates

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

POST api/v1/sa/notification-templates

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/notification-templates" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"notificationChannelType\": \"email\",
    \"notificationTemplateFormatType\": \"text\",
    \"name\": \"Critical Alert Template\",
    \"subjectTemplate\": \"[Alert] Collector Offline\",
    \"bodyTemplate\": \"Alert: Collector went offline at Farm Alpha.\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/notification-templates"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "notificationChannelType": "email",
    "notificationTemplateFormatType": "text",
    "name": "Critical Alert Template",
    "subjectTemplate": "[Alert] Collector Offline",
    "bodyTemplate": "Alert: Collector went offline at Farm Alpha."
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/notification-templates',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'notificationChannelType' => 'email',
            'notificationTemplateFormatType' => 'text',
            'name' => 'Critical Alert Template',
            'subjectTemplate' => '[Alert] Collector Offline',
            'bodyTemplate' => 'Alert: Collector went offline at Farm Alpha.',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/notification-templates'
payload = {
    "notificationChannelType": "email",
    "notificationTemplateFormatType": "text",
    "name": "Critical Alert Template",
    "subjectTemplate": "[Alert] Collector Offline",
    "bodyTemplate": "Alert: Collector went offline at Farm Alpha."
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/notification-templates

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

notificationChannelType   string   

Notification channel type slug. The slug of an existing record in the notification_channel_types table. Example: email

notificationTemplateFormatType   string   

Notification template format type slug. The slug of an existing record in the notification_template_format_types table. Example: text

name   string   

Template name. Must not be greater than 255 characters. Example: Critical Alert Template

subjectTemplate   string  optional  

Optional subject template. Supports double-curly-brace placeholders: ruleName, collectorName, triggeredValue, conditionOperator, conditionThreshold, triggeredAt, companyName, farmName. Must not be greater than 500 characters. Example: [Alert] Collector Offline

bodyTemplate   string   

Template body content. Supports double-curly-brace placeholders: ruleName, collectorName, triggeredValue, conditionOperator, conditionThreshold, triggeredAt, companyName, farmName. Example: Alert: Collector went offline at Farm Alpha.

GET api/v1/sa/notification-templates/{notificationTemplate_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/notification-templates/{notificationTemplate_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

notificationTemplate_uuid   string   

Example: d4d5b924-eff1-44a7-bcc9-b271d8207888

PUT api/v1/sa/notification-templates/{notificationTemplate_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/sa/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"notificationChannelType\": \"email\",
    \"notificationTemplateFormatType\": \"html\",
    \"name\": \"Updated Alert Template\",
    \"subjectTemplate\": \"[Updated] Collector Offline\",
    \"bodyTemplate\": \"<p>Alert rule updated for Collector Alpha.<\\/p>\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "notificationChannelType": "email",
    "notificationTemplateFormatType": "html",
    "name": "Updated Alert Template",
    "subjectTemplate": "[Updated] Collector Offline",
    "bodyTemplate": "<p>Alert rule updated for Collector Alpha.<\/p>"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/sa/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'notificationChannelType' => 'email',
            'notificationTemplateFormatType' => 'html',
            'name' => 'Updated Alert Template',
            'subjectTemplate' => '[Updated] Collector Offline',
            'bodyTemplate' => '<p>Alert rule updated for Collector Alpha.</p>',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888'
payload = {
    "notificationChannelType": "email",
    "notificationTemplateFormatType": "html",
    "name": "Updated Alert Template",
    "subjectTemplate": "[Updated] Collector Offline",
    "bodyTemplate": "<p>Alert rule updated for Collector Alpha.<\/p>"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/sa/notification-templates/{notificationTemplate_uuid}

PATCH api/v1/sa/notification-templates/{notificationTemplate_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

notificationTemplate_uuid   string   

Example: d4d5b924-eff1-44a7-bcc9-b271d8207888

Body Parameters

notificationChannelType   string  optional  

Notification channel type slug. The slug of an existing record in the notification_channel_types table. Example: email

notificationTemplateFormatType   string  optional  

Notification template format type slug. The slug of an existing record in the notification_template_format_types table. Example: html

name   string  optional  

Template name. Must not be greater than 255 characters. Example: Updated Alert Template

subjectTemplate   string  optional  

Optional subject template. Supports double-curly-brace placeholders: ruleName, collectorName, triggeredValue, conditionOperator, conditionThreshold, triggeredAt, companyName, farmName. Must not be greater than 500 characters. Example: [Updated] Collector Offline

bodyTemplate   string  optional  

Template body content. Supports double-curly-brace placeholders: ruleName, collectorName, triggeredValue, conditionOperator, conditionThreshold, triggeredAt, companyName, farmName. Example: <p>Alert rule updated for Collector Alpha.</p>

DELETE api/v1/sa/notification-templates/{notificationTemplate_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/notification-templates/d4d5b924-eff1-44a7-bcc9-b271d8207888'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/notification-templates/{notificationTemplate_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

notificationTemplate_uuid   string   

Example: d4d5b924-eff1-44a7-bcc9-b271d8207888

GET api/v1/sa/c/{company_slug}/notification-policies

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/notification-policies

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

POST api/v1/sa/c/{company_slug}/notification-policies

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"companySlug\": \"acme-solar\",
    \"farmUuid\": \"550e8400-e29b-41d4-a716-446655440121\",
    \"collectorUuid\": \"550e8400-e29b-41d4-a716-446655440122\",
    \"name\": \"Critical Weather Policy\",
    \"enabled\": true,
    \"notificationChannelUuid\": \"550e8400-e29b-41d4-a716-446655440123\",
    \"notificationTemplateUuid\": \"550e8400-e29b-41d4-a716-446655440124\",
    \"labels\": [
        {
            \"key\": \"severity\",
            \"value\": \"critical\"
        }
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "companySlug": "acme-solar",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440121",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440122",
    "name": "Critical Weather Policy",
    "enabled": true,
    "notificationChannelUuid": "550e8400-e29b-41d4-a716-446655440123",
    "notificationTemplateUuid": "550e8400-e29b-41d4-a716-446655440124",
    "labels": [
        {
            "key": "severity",
            "value": "critical"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'companySlug' => 'acme-solar',
            'farmUuid' => '550e8400-e29b-41d4-a716-446655440121',
            'collectorUuid' => '550e8400-e29b-41d4-a716-446655440122',
            'name' => 'Critical Weather Policy',
            'enabled' => true,
            'notificationChannelUuid' => '550e8400-e29b-41d4-a716-446655440123',
            'notificationTemplateUuid' => '550e8400-e29b-41d4-a716-446655440124',
            'labels' => [
                [
                    'key' => 'severity',
                    'value' => 'critical',
                ],
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies'
payload = {
    "companySlug": "acme-solar",
    "farmUuid": "550e8400-e29b-41d4-a716-446655440121",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440122",
    "name": "Critical Weather Policy",
    "enabled": true,
    "notificationChannelUuid": "550e8400-e29b-41d4-a716-446655440123",
    "notificationTemplateUuid": "550e8400-e29b-41d4-a716-446655440124",
    "labels": [
        {
            "key": "severity",
            "value": "critical"
        }
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/notification-policies

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

companySlug   string  optional  

Company scope slug. Provide exactly one scope field. The slug of an existing record in the companies table. Example: acme-solar

farmUuid   string  optional  

Farm scope UUID. Provide exactly one scope field. Must be a valid UUID. The uuid of an existing record in the farms table. Example: 550e8400-e29b-41d4-a716-446655440121

collectorUuid   string  optional  

Collector scope UUID. Provide exactly one scope field. Must be a valid UUID. The uuid of an existing record in the collectors table. Example: 550e8400-e29b-41d4-a716-446655440122

name   string   

Notification policy name. Must not be greater than 255 characters. Example: Critical Weather Policy

enabled   boolean  optional  

Whether the policy is enabled. Example: true

notificationChannelUuid   string   

Notification channel UUID. Must be a valid UUID. The uuid of an existing record in the notification_channels table. Example: 550e8400-e29b-41d4-a716-446655440123

notificationTemplateUuid   string   

Notification template UUID. Must be a valid UUID. The uuid of an existing record in the notification_templates table. Example: 550e8400-e29b-41d4-a716-446655440124

labels   object[]  optional  

Optional key/value label filters.

key   string  optional  

This field is required when labels is present. Must not be greater than 255 characters. Example: yoosdfdactispddgng

value   string  optional  

This field is required when labels is present. Must not be greater than 255 characters. Example: xpsb

GET api/v1/sa/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies/0d78281c-7fe7-343b-b373-ef3ef026a738" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies/0d78281c-7fe7-343b-b373-ef3ef026a738"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies/0d78281c-7fe7-343b-b373-ef3ef026a738',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies/0d78281c-7fe7-343b-b373-ef3ef026a738'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationPolicy_uuid   string   

Example: 0d78281c-7fe7-343b-b373-ef3ef026a738

PUT api/v1/sa/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies/c03a2117-9413-3c58-9964-5b65a474630a" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Critical Weather Policy\",
    \"enabled\": false,
    \"notificationChannelUuid\": \"550e8400-e29b-41d4-a716-446655440223\",
    \"notificationTemplateUuid\": \"550e8400-e29b-41d4-a716-446655440224\",
    \"labels\": [
        {
            \"key\": \"site\",
            \"value\": \"north-farm\"
        }
    ]
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies/c03a2117-9413-3c58-9964-5b65a474630a"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Critical Weather Policy",
    "enabled": false,
    "notificationChannelUuid": "550e8400-e29b-41d4-a716-446655440223",
    "notificationTemplateUuid": "550e8400-e29b-41d4-a716-446655440224",
    "labels": [
        {
            "key": "site",
            "value": "north-farm"
        }
    ]
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies/c03a2117-9413-3c58-9964-5b65a474630a',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Critical Weather Policy',
            'enabled' => false,
            'notificationChannelUuid' => '550e8400-e29b-41d4-a716-446655440223',
            'notificationTemplateUuid' => '550e8400-e29b-41d4-a716-446655440224',
            'labels' => [
                [
                    'key' => 'site',
                    'value' => 'north-farm',
                ],
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies/c03a2117-9413-3c58-9964-5b65a474630a'
payload = {
    "name": "Critical Weather Policy",
    "enabled": false,
    "notificationChannelUuid": "550e8400-e29b-41d4-a716-446655440223",
    "notificationTemplateUuid": "550e8400-e29b-41d4-a716-446655440224",
    "labels": [
        {
            "key": "site",
            "value": "north-farm"
        }
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/sa/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

PATCH api/v1/sa/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationPolicy_uuid   string   

Example: c03a2117-9413-3c58-9964-5b65a474630a

Body Parameters

name   string  optional  

Notification policy name. Must not be greater than 255 characters. Example: Critical Weather Policy

enabled   boolean  optional  

Whether the policy is enabled. Example: false

notificationChannelUuid   string  optional  

Notification channel UUID. Must be a valid UUID. The uuid of an existing record in the notification_channels table. Example: 550e8400-e29b-41d4-a716-446655440223

notificationTemplateUuid   string  optional  

Notification template UUID. Must be a valid UUID. The uuid of an existing record in the notification_templates table. Example: 550e8400-e29b-41d4-a716-446655440224

labels   object[]  optional  

Optional key/value label filters.

key   string  optional  

This field is required when labels is present. Must not be greater than 255 characters. Example: hgckwvgnncagwsqsqi

value   string  optional  

This field is required when labels is present. Must not be greater than 255 characters. Example: oqersoyuyqw

DELETE api/v1/sa/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies/1722d8a4-3326-3532-be32-a5818adaa1d5" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies/1722d8a4-3326-3532-be32-a5818adaa1d5"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies/1722d8a4-3326-3532-be32-a5818adaa1d5',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/notification-policies/1722d8a4-3326-3532-be32-a5818adaa1d5'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}/notification-policies/{notificationPolicy_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

notificationPolicy_uuid   string   

Example: 1722d8a4-3326-3532-be32-a5818adaa1d5

Quality report: failure counts grouped by device model, firmware, and hardware version.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/quality-report" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/quality-report"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/quality-report',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/quality-report'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/quality-report

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Inventory summary: per-company collector status counts.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/inventory" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/inventory"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/inventory',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/inventory'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/inventory

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

List all RMA requests across all companies.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/rma" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/rma"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/rma',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/rma'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/rma

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Show a single RMA request with full relations.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/rma/9f632600-b90f-3b96-8a31-923a8b9f8811" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/rma/9f632600-b90f-3b96-8a31-923a8b9f8811"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/rma/9f632600-b90f-3b96-8a31-923a8b9f8811',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/rma/9f632600-b90f-3b96-8a31-923a8b9f8811'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/rma/{rmaRequest_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

rmaRequest_uuid   string   

Example: 9f632600-b90f-3b96-8a31-923a8b9f8811

Update the status of an RMA request (intermediate workflow statuses).

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/rma/b6858e97-83fb-3f35-bbe2-4f57361d71d8" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"status\": \"diagnosing\",
    \"notes\": \"Device received and initial electrical diagnostics started.\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/rma/b6858e97-83fb-3f35-bbe2-4f57361d71d8"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "status": "diagnosing",
    "notes": "Device received and initial electrical diagnostics started."
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/rma/b6858e97-83fb-3f35-bbe2-4f57361d71d8',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'status' => 'diagnosing',
            'notes' => 'Device received and initial electrical diagnostics started.',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/rma/b6858e97-83fb-3f35-bbe2-4f57361d71d8'
payload = {
    "status": "diagnosing",
    "notes": "Device received and initial electrical diagnostics started."
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/rma/{rmaRequest_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

rmaRequest_uuid   string   

Example: b6858e97-83fb-3f35-bbe2-4f57361d71d8

Body Parameters

status   string   

Updated super-admin RMA workflow status. Example: diagnosing

notes   string  optional  

Optional status update notes. Must not be greater than 5000 characters. Example: Device received and initial electrical diagnostics started.

Approve an RMA request.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/rma/ff30af8f-544a-356f-9bc8-c760bd88d80d/approve" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/rma/ff30af8f-544a-356f-9bc8-c760bd88d80d/approve"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/rma/ff30af8f-544a-356f-9bc8-c760bd88d80d/approve',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/rma/ff30af8f-544a-356f-9bc8-c760bd88d80d/approve'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/sa/rma/{rmaRequest_uuid}/approve

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

rmaRequest_uuid   string   

Example: ff30af8f-544a-356f-9bc8-c760bd88d80d

Reject an RMA request.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/rma/21440c3d-2fdf-3861-810d-912c4d271136/reject" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"reason\": \"Submitted issue does not meet warranty criteria.\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/rma/21440c3d-2fdf-3861-810d-912c4d271136/reject"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "reason": "Submitted issue does not meet warranty criteria."
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/rma/21440c3d-2fdf-3861-810d-912c4d271136/reject',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'reason' => 'Submitted issue does not meet warranty criteria.',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/rma/21440c3d-2fdf-3861-810d-912c4d271136/reject'
payload = {
    "reason": "Submitted issue does not meet warranty criteria."
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/rma/{rmaRequest_uuid}/reject

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

rmaRequest_uuid   string   

Example: 21440c3d-2fdf-3861-810d-912c4d271136

Body Parameters

reason   string   

Reason the RMA request is being rejected. Must not be greater than 2000 characters. Example: Submitted issue does not meet warranty criteria.

Resolve an RMA request (repaired, replaced, or unrepairable).

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/rma/6939404e-72fc-363e-aa31-045c5ba1b7d3/resolve" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"resolutionType\": \"replaced\",
    \"notes\": \"Unit replaced after diagnostics confirmed controller board failure.\",
    \"replacementCollectorUuid\": \"550e8400-e29b-41d4-a716-446655440110\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/rma/6939404e-72fc-363e-aa31-045c5ba1b7d3/resolve"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "resolutionType": "replaced",
    "notes": "Unit replaced after diagnostics confirmed controller board failure.",
    "replacementCollectorUuid": "550e8400-e29b-41d4-a716-446655440110"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/rma/6939404e-72fc-363e-aa31-045c5ba1b7d3/resolve',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'resolutionType' => 'replaced',
            'notes' => 'Unit replaced after diagnostics confirmed controller board failure.',
            'replacementCollectorUuid' => '550e8400-e29b-41d4-a716-446655440110',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/rma/6939404e-72fc-363e-aa31-045c5ba1b7d3/resolve'
payload = {
    "resolutionType": "replaced",
    "notes": "Unit replaced after diagnostics confirmed controller board failure.",
    "replacementCollectorUuid": "550e8400-e29b-41d4-a716-446655440110"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/rma/{rmaRequest_uuid}/resolve

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

rmaRequest_uuid   string   

Example: 6939404e-72fc-363e-aa31-045c5ba1b7d3

Body Parameters

resolutionType   string   

Final resolution classification. Example: replaced

notes   string   

Resolution summary and service notes. Must not be greater than 5000 characters. Example: Unit replaced after diagnostics confirmed controller board failure.

replacementCollectorUuid   string  optional  

Required when resolutionType is replaced. Must be a valid UUID. The uuid of an existing record in the collectors table. Example: 550e8400-e29b-41d4-a716-446655440110

Cancel an RMA request.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/rma/d8ef4ca4-8a75-37fe-adc3-2b1c04cebf53/cancel" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"reason\": \"arfnqxunwpndjcu\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/rma/d8ef4ca4-8a75-37fe-adc3-2b1c04cebf53/cancel"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "reason": "arfnqxunwpndjcu"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/rma/d8ef4ca4-8a75-37fe-adc3-2b1c04cebf53/cancel',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'reason' => 'arfnqxunwpndjcu',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/rma/d8ef4ca4-8a75-37fe-adc3-2b1c04cebf53/cancel'
payload = {
    "reason": "arfnqxunwpndjcu"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/rma/{rmaRequest_uuid}/cancel

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

rmaRequest_uuid   string   

Example: d8ef4ca4-8a75-37fe-adc3-2b1c04cebf53

Body Parameters

reason   string   

Must not be greater than 2000 characters. Example: arfnqxunwpndjcu

List notes for an RMA request.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/rma/e7db2fb6-eb2c-3c79-8468-d7b7c6539a24/notes" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/rma/e7db2fb6-eb2c-3c79-8468-d7b7c6539a24/notes"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/rma/e7db2fb6-eb2c-3c79-8468-d7b7c6539a24/notes',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/rma/e7db2fb6-eb2c-3c79-8468-d7b7c6539a24/notes'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/rma/{rmaRequest_uuid}/notes

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

rmaRequest_uuid   string   

Example: e7db2fb6-eb2c-3c79-8468-d7b7c6539a24

Add a note to an RMA request.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/rma/80ff2697-0dbc-3fef-8227-87600a16b4a0/notes" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"note\": \"Customer confirmed issue is reproducible after reboot.\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/rma/80ff2697-0dbc-3fef-8227-87600a16b4a0/notes"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "note": "Customer confirmed issue is reproducible after reboot."
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/rma/80ff2697-0dbc-3fef-8227-87600a16b4a0/notes',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'note' => 'Customer confirmed issue is reproducible after reboot.',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/rma/80ff2697-0dbc-3fef-8227-87600a16b4a0/notes'
payload = {
    "note": "Customer confirmed issue is reproducible after reboot."
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/rma/{rmaRequest_uuid}/notes

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

rmaRequest_uuid   string   

Example: 80ff2697-0dbc-3fef-8227-87600a16b4a0

Body Parameters

note   string   

Note text to append to the RMA timeline. Must not be greater than 5000 characters. Example: Customer confirmed issue is reproducible after reboot.

GET api/v1/sa/tracklab/users

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/tracklab/users" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/tracklab/users"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/tracklab/users',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/tracklab/users'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/tracklab/users

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

POST api/v1/sa/tracklab/users

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/tracklab/users" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"new.user@tracklab.com\",
    \"firstName\": \"John\",
    \"lastName\": \"Doe\",
    \"countryIsoCode\": \"US\",
    \"phoneNumber\": \"+1234567890\",
    \"role\": \"admin\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/tracklab/users"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "new.user@tracklab.com",
    "firstName": "John",
    "lastName": "Doe",
    "countryIsoCode": "US",
    "phoneNumber": "+1234567890",
    "role": "admin"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/tracklab/users',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'new.user@tracklab.com',
            'firstName' => 'John',
            'lastName' => 'Doe',
            'countryIsoCode' => 'US',
            'phoneNumber' => '+1234567890',
            'role' => 'admin',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/tracklab/users'
payload = {
    "email": "new.user@tracklab.com",
    "firstName": "John",
    "lastName": "Doe",
    "countryIsoCode": "US",
    "phoneNumber": "+1234567890",
    "role": "admin"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/tracklab/users

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

email   string   

User email address. Must be a valid email address. Must not be greater than 100 characters. Example: new.user@tracklab.com

firstName   string   

User first name. Must be at least 2 characters. Must not be greater than 100 characters. Example: John

lastName   string  optional  

User last name. Must be at least 2 characters. Must not be greater than 100 characters. Example: Doe

countryIsoCode   string   

ISO country code. The iso_code of an existing record in the countries table. Example: US

phoneNumber   string   

User phone number. Must be at least 6 characters. Example: +1234567890

role   string   

User role (owner, admin, or user). Example: admin

GET api/v1/sa/tracklab/users/{user_uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/tracklab/users/{user_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

PATCH api/v1/sa/tracklab/users/{user_uuid}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"updated.user@tracklab.com\",
    \"firstName\": \"John\",
    \"lastName\": \"Smith\",
    \"countryIsoCode\": \"US\",
    \"phoneNumber\": \"+1987654321\",
    \"role\": \"user\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "updated.user@tracklab.com",
    "firstName": "John",
    "lastName": "Smith",
    "countryIsoCode": "US",
    "phoneNumber": "+1987654321",
    "role": "user"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'updated.user@tracklab.com',
            'firstName' => 'John',
            'lastName' => 'Smith',
            'countryIsoCode' => 'US',
            'phoneNumber' => '+1987654321',
            'role' => 'user',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd'
payload = {
    "email": "updated.user@tracklab.com",
    "firstName": "John",
    "lastName": "Smith",
    "countryIsoCode": "US",
    "phoneNumber": "+1987654321",
    "role": "user"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/tracklab/users/{user_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

Body Parameters

email   string  optional  

User email address. Must be a valid email address. Must not be greater than 100 characters. Example: updated.user@tracklab.com

firstName   string  optional  

User first name. Must be at least 2 characters. Must not be greater than 100 characters. Example: John

lastName   string  optional  

User last name. Must be at least 2 characters. Must not be greater than 100 characters. Example: Smith

countryIsoCode   string  optional  

ISO country code. The iso_code of an existing record in the countries table. Example: US

phoneNumber   string  optional  

User phone number. Must be at least 6 characters. Example: +1987654321

role   string  optional  

User role (owner, admin, or user). Example: user

DELETE api/v1/sa/tracklab/users/{user_uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user\": \"47921254-d262-34f7-8bc2-84fd0dc024fe\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "user": "47921254-d262-34f7-8bc2-84fd0dc024fe"
};

fetch(url, {
    method: "DELETE",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'user' => '47921254-d262-34f7-8bc2-84fd0dc024fe',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd'
payload = {
    "user": "47921254-d262-34f7-8bc2-84fd0dc024fe"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers, json=payload)
response.json()

Request      

DELETE api/v1/sa/tracklab/users/{user_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

Body Parameters

user   string   

Must be a valid UUID. Example: 47921254-d262-34f7-8bc2-84fd0dc024fe

List warranties expiring within N days.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/warranty/expiring" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/warranty/expiring"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/warranty/expiring',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/warranty/expiring'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/warranty/expiring

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/health

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/health" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/health"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/health',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/health'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: must-revalidate, no-cache, no-store, post-check=0, pre-check=0, private
content-type: application/json
vary: Origin
 

{
    "finishedAt": 1774566311,
    "checkResults": []
}
 

Request      

GET api/v1/health

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/firmware/download

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/firmware/download" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/firmware/download"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/firmware/download',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/firmware/download'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (400):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Firmware slug required"
}
 

Request      

GET api/v1/firmware/download

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/firmware/download/{token}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/firmware/download/aperiam" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/firmware/download/aperiam"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/firmware/download/aperiam',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/firmware/download/aperiam'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (400):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Firmware slug required"
}
 

Request      

GET api/v1/firmware/download/{token}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

token   string   

Example: aperiam

Download measurements using a signed link without authentication.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/open/c/tracklab/measurements?types[]=architecto&from=2025-01-01T00%3A00%3A00Z&collectorUuids[]=quo&farmUuid=d5b1b4e7-2d71-4c16-9c0c-fc0c2b9f3d0d&farmSectionUuid=3b3fb893-1e88-4c3c-8b10-0a5c2b3cf6aa&collectorTypeSlug=ncu&to=2025-01-02T00%3A00%3A00Z&raw=&period=minute&aggregation=avg&valueMin=0&valueMax=1000&groupBy=measurement_type&includeMetadata=1&includeReplacements=&includeCount=&exportType=json&page=1&perPage=100" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/open/c/tracklab/measurements"
);

const params = {
    "types[0]": "architecto",
    "from": "2025-01-01T00:00:00Z",
    "collectorUuids[0]": "quo",
    "farmUuid": "d5b1b4e7-2d71-4c16-9c0c-fc0c2b9f3d0d",
    "farmSectionUuid": "3b3fb893-1e88-4c3c-8b10-0a5c2b3cf6aa",
    "collectorTypeSlug": "ncu",
    "to": "2025-01-02T00:00:00Z",
    "raw": "0",
    "period": "minute",
    "aggregation": "avg",
    "valueMin": "0",
    "valueMax": "1000",
    "groupBy": "measurement_type",
    "includeMetadata": "1",
    "includeReplacements": "0",
    "includeCount": "0",
    "exportType": "json",
    "page": "1",
    "perPage": "100",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/open/c/tracklab/measurements',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'types[0]' => 'architecto',
            'from' => '2025-01-01T00:00:00Z',
            'collectorUuids[0]' => 'quo',
            'farmUuid' => 'd5b1b4e7-2d71-4c16-9c0c-fc0c2b9f3d0d',
            'farmSectionUuid' => '3b3fb893-1e88-4c3c-8b10-0a5c2b3cf6aa',
            'collectorTypeSlug' => 'ncu',
            'to' => '2025-01-02T00:00:00Z',
            'raw' => '0',
            'period' => 'minute',
            'aggregation' => 'avg',
            'valueMin' => '0',
            'valueMax' => '1000',
            'groupBy' => 'measurement_type',
            'includeMetadata' => '1',
            'includeReplacements' => '0',
            'includeCount' => '0',
            'exportType' => 'json',
            'page' => '1',
            'perPage' => '100',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/open/c/tracklab/measurements'
params = {
  'types[0]': 'architecto',
  'from': '2025-01-01T00:00:00Z',
  'collectorUuids[0]': 'quo',
  'farmUuid': 'd5b1b4e7-2d71-4c16-9c0c-fc0c2b9f3d0d',
  'farmSectionUuid': '3b3fb893-1e88-4c3c-8b10-0a5c2b3cf6aa',
  'collectorTypeSlug': 'ncu',
  'to': '2025-01-02T00:00:00Z',
  'raw': '0',
  'period': 'minute',
  'aggregation': 'avg',
  'valueMin': '0',
  'valueMax': '1000',
  'groupBy': 'measurement_type',
  'includeMetadata': '1',
  'includeReplacements': '0',
  'includeCount': '0',
  'exportType': 'json',
  'page': '1',
  'perPage': '100',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Invalid signature."
}
 

Request      

GET api/v1/open/c/{company_slug}/measurements

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Query Parameters

types   string[]  optional  

The slug of an existing record in the collector_measurement_types table.

from   string   

Start timestamp (ISO 8601). Must be a valid date. Must be a date before now. Example: 2025-01-01T00:00:00Z

collectorUuids   string[]  optional  

The uuid of an existing record in the collectors table.

farmUuid   string  optional  

Filter by farm UUID. The uuid of an existing record in the farms table. Example: d5b1b4e7-2d71-4c16-9c0c-fc0c2b9f3d0d

farmSectionUuid   string  optional  

Filter by farm section UUID. The uuid of an existing record in the farm_sections table. Example: 3b3fb893-1e88-4c3c-8b10-0a5c2b3cf6aa

collectorTypeSlug   string  optional  

Filter by collector type slug. The slug of an existing record in the collector_types table. Example: ncu

to   string  optional  

End timestamp (ISO 8601). Must be a valid date. Must be a date after from. Example: 2025-01-02T00:00:00Z

raw   boolean  optional  

When true, returns raw measurements without aggregation. Example: false

period   string  optional  

Aggregation period type slug (when raw=false). The slug of an existing record in the period_types table. Example: minute

aggregation   string  optional  

Aggregation method slug (enabled aggregation types only). The slug of an existing record in the measurement_aggregation_types table. Example: avg

valueMin   number  optional  

Minimum measurement value filter. Example: 0

valueMax   number  optional  

Maximum measurement value filter. Example: 1000

groupBy   string  optional  

Group results by dimension. Example: measurement_type

includeMetadata   boolean  optional  

Include measurement type / collector metadata. Example: true

includeReplacements   boolean  optional  

When querying by collector UUIDs, include collector history on the same tracker(s) across handovers. Example: false

includeCount   boolean  optional  

Include total record count per group. Example: false

exportType   string  optional  

Optional export format. Example: json

page   integer  optional  

Page number for pagination. Must be at least 1. Example: 1

perPage   integer  optional  

Items per page (max 10000). Must be at least 1. Must not be greater than 10000. Example: 100

Get Profile Picture (Signed URL)

requires authentication

Retrieve a user's profile picture using a signed URL token. The token contains encrypted user UUID and expiry timestamp.

URL format: /me/profile/picture/{signedToken}/{format}/image.webp

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/me/profile/picture/eyJpdiI6.../square-48-webp/image.webp" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/me/profile/picture/eyJpdiI6.../square-48-webp/image.webp"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/me/profile/picture/eyJpdiI6.../square-48-webp/image.webp',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/me/profile/picture/eyJpdiI6.../square-48-webp/image.webp'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


The image file stream
 

Example response (403):


{
    "message": "Invalid or expired token."
}
 

Example response (404):


{
    "message": "User not found."
}
 

Request      

GET api/v1/me/profile/picture/{signedToken}/{format}/image.webp

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

signedToken   string   

The encrypted signed token. Example: eyJpdiI6...

format   string   

The image format/conversion name. Example: square-48-webp

GET api/v1/email/verify/{id}/{hash}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/email/verify/qui/incidunt" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/email/verify/qui/incidunt"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/email/verify/qui/incidunt',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/email/verify/qui/incidunt'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 6
x-ratelimit-remaining: 2
vary: Origin
 

{
    "success": false,
    "message": "Invalid verification link"
}
 

Request      

GET api/v1/email/verify/{id}/{hash}

POST api/v1/email/verify/{id}/{hash}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the verify. Example: qui

hash   string   

Example: incidunt

Serve a section icon via signed token.

requires authentication

URL: /api/v1/doc-lib/sections/{sectionUuid}/icon/{signedToken}/{format}/image.webp

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/doc-lib/sections/459c09dc-bdcf-3774-886c-d6e684f68557/icon/cum/voluptatum/image.webp" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/doc-lib/sections/459c09dc-bdcf-3774-886c-d6e684f68557/icon/cum/voluptatum/image.webp"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/doc-lib/sections/459c09dc-bdcf-3774-886c-d6e684f68557/icon/cum/voluptatum/image.webp',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/doc-lib/sections/459c09dc-bdcf-3774-886c-d6e684f68557/icon/cum/voluptatum/image.webp'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Invalid or expired token."
}
 

Request      

GET api/v1/doc-lib/sections/{sectionUuid}/icon/{signedToken}/{format}/image.webp

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

sectionUuid   string   

Example: 459c09dc-bdcf-3774-886c-d6e684f68557

signedToken   string   

Example: cum

format   string   

Example: voluptatum

Serve a category icon via signed token.

requires authentication

URL: /api/v1/doc-lib/categories/{categoryUuid}/icon/{signedToken}/{format}/image.webp

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/doc-lib/categories/3d62664c-fffe-310a-b493-c97303857651/icon/et/est/image.webp" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/doc-lib/categories/3d62664c-fffe-310a-b493-c97303857651/icon/et/est/image.webp"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/doc-lib/categories/3d62664c-fffe-310a-b493-c97303857651/icon/et/est/image.webp',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/doc-lib/categories/3d62664c-fffe-310a-b493-c97303857651/icon/et/est/image.webp'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Invalid or expired token."
}
 

Request      

GET api/v1/doc-lib/categories/{categoryUuid}/icon/{signedToken}/{format}/image.webp

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

categoryUuid   string   

Example: 3d62664c-fffe-310a-b493-c97303857651

signedToken   string   

Example: et

format   string   

Example: est

Serve a document icon via signed token.

requires authentication

URL: /api/v1/doc-lib/documents/{documentSectionDocumentUuid}/icon/{signedToken}/{format}/image.webp

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/doc-lib/documents/bca27556-039a-39a9-829e-736f095f59ce/icon/eveniet/doloremque/image.webp" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/doc-lib/documents/bca27556-039a-39a9-829e-736f095f59ce/icon/eveniet/doloremque/image.webp"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/doc-lib/documents/bca27556-039a-39a9-829e-736f095f59ce/icon/eveniet/doloremque/image.webp',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/doc-lib/documents/bca27556-039a-39a9-829e-736f095f59ce/icon/eveniet/doloremque/image.webp'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Invalid or expired token."
}
 

Request      

GET api/v1/doc-lib/documents/{documentSectionDocumentUuid}/icon/{signedToken}/{format}/image.webp

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

documentSectionDocumentUuid   string   

Example: bca27556-039a-39a9-829e-736f095f59ce

signedToken   string   

Example: eveniet

format   string   

Example: doloremque

Serve a document file via signed token.

requires authentication

URL: /api/v1/doc-lib/documents/{documentSectionDocumentUuid}/{signedToken}/{format}/file

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/doc-lib/documents/8fb050a9-44e3-324c-9b2b-0e0b3e838614/et/sit/file" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/doc-lib/documents/8fb050a9-44e3-324c-9b2b-0e0b3e838614/et/sit/file"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/doc-lib/documents/8fb050a9-44e3-324c-9b2b-0e0b3e838614/et/sit/file',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/doc-lib/documents/8fb050a9-44e3-324c-9b2b-0e0b3e838614/et/sit/file'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (403):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Invalid or expired token."
}
 

Request      

GET api/v1/doc-lib/documents/{documentSectionDocumentUuid}/{signedToken}/{format}/file

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

documentSectionDocumentUuid   string   

Example: 8fb050a9-44e3-324c-9b2b-0e0b3e838614

signedToken   string   

Example: et

format   string   

Example: sit

POST api/v1/c/{companySlug}/automation/webhooks/{automationInboundWebhookSource_uuid}/ingest

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/officia/automation/webhooks/03a0e431-35e7-383e-81d5-962acc9f2524/ingest" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/officia/automation/webhooks/03a0e431-35e7-383e-81d5-962acc9f2524/ingest"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/officia/automation/webhooks/03a0e431-35e7-383e-81d5-962acc9f2524/ingest',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/officia/automation/webhooks/03a0e431-35e7-383e-81d5-962acc9f2524/ingest'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/c/{companySlug}/automation/webhooks/{automationInboundWebhookSource_uuid}/ingest

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

companySlug   string   

Example: officia

automationInboundWebhookSource_uuid   string   

Example: 03a0e431-35e7-383e-81d5-962acc9f2524

POST api/v1/c/{companySlug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/ingest

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/c/magni/automation/test/webhook-endpoints/c2f61321-2f80-3814-9e90-9b23fbe6df39/ingest" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/c/magni/automation/test/webhook-endpoints/c2f61321-2f80-3814-9e90-9b23fbe6df39/ingest"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/c/magni/automation/test/webhook-endpoints/c2f61321-2f80-3814-9e90-9b23fbe6df39/ingest',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/c/magni/automation/test/webhook-endpoints/c2f61321-2f80-3814-9e90-9b23fbe6df39/ingest'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/c/{companySlug}/automation/test/webhook-endpoints/{automationTestWebhookEndpoint_uuid}/ingest

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

companySlug   string   

Example: magni

automationTestWebhookEndpoint_uuid   string   

Example: c2f61321-2f80-3814-9e90-9b23fbe6df39

GET api/v1/type/automation-action-failure-mode

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/automation-action-failure-mode?page=1&perPage=20&sort=hbupydlmptqmsdlfl&sortBy=stugzwgjkywtlopssg&sortOrder=desc&filter[search]=bfrmnaregohpwbttlv&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/automation-action-failure-mode"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "hbupydlmptqmsdlfl",
    "sortBy": "stugzwgjkywtlopssg",
    "sortOrder": "desc",
    "filter[search]": "bfrmnaregohpwbttlv",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/automation-action-failure-mode',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'hbupydlmptqmsdlfl',
            'sortBy' => 'stugzwgjkywtlopssg',
            'sortOrder' => 'desc',
            'filter[search]' => 'bfrmnaregohpwbttlv',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/automation-action-failure-mode'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'hbupydlmptqmsdlfl',
  'sortBy': 'stugzwgjkywtlopssg',
  'sortOrder': 'desc',
  'filter[search]': 'bfrmnaregohpwbttlv',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/automation-action-failure-mode?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/automation-action-failure-mode?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/automation-action-failure-mode?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/automation-action-failure-mode",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/automation-action-failure-mode

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: hbupydlmptqmsdlfl

sortBy   string  optional  

Must not be greater than 255 characters. Example: stugzwgjkywtlopssg

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: bfrmnaregohpwbttlv

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/automation-action-target

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/automation-action-target?page=1&perPage=20&sort=pr&sortBy=wiarbrfeaesptqi&sortOrder=desc&filter[search]=pilgjmekedrnubmcheeb&filter[active]=1&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/automation-action-target"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "pr",
    "sortBy": "wiarbrfeaesptqi",
    "sortOrder": "desc",
    "filter[search]": "pilgjmekedrnubmcheeb",
    "filter[active]": "1",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/automation-action-target',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'pr',
            'sortBy' => 'wiarbrfeaesptqi',
            'sortOrder' => 'desc',
            'filter[search]' => 'pilgjmekedrnubmcheeb',
            'filter[active]' => '1',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/automation-action-target'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'pr',
  'sortBy': 'wiarbrfeaesptqi',
  'sortOrder': 'desc',
  'filter[search]': 'pilgjmekedrnubmcheeb',
  'filter[active]': '1',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/automation-action-target?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/automation-action-target?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/automation-action-target?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/automation-action-target",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/automation-action-target

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: pr

sortBy   string  optional  

Must not be greater than 255 characters. Example: wiarbrfeaesptqi

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: pilgjmekedrnubmcheeb

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/automation-action

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/automation-action?page=1&perPage=20&sort=xglsvtouaivycf&sortBy=vqfzystkzuxpygrceasl&sortOrder=desc&filter[search]=qlgkkyzkuzwbevh&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/automation-action"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "xglsvtouaivycf",
    "sortBy": "vqfzystkzuxpygrceasl",
    "sortOrder": "desc",
    "filter[search]": "qlgkkyzkuzwbevh",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/automation-action',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'xglsvtouaivycf',
            'sortBy' => 'vqfzystkzuxpygrceasl',
            'sortOrder' => 'desc',
            'filter[search]' => 'qlgkkyzkuzwbevh',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/automation-action'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'xglsvtouaivycf',
  'sortBy': 'vqfzystkzuxpygrceasl',
  'sortOrder': 'desc',
  'filter[search]': 'qlgkkyzkuzwbevh',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/automation-action?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/automation-action?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/automation-action?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/automation-action",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/automation-action

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: xglsvtouaivycf

sortBy   string  optional  

Must not be greater than 255 characters. Example: vqfzystkzuxpygrceasl

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: qlgkkyzkuzwbevh

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/automation-condition-group-operator

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/automation-condition-group-operator?page=1&perPage=20&sort=mlmycabslbflukoh&sortBy=kotajfvkcoilufyvmyd&sortOrder=asc&filter[search]=luvpbwohkdudiwyp&filter[active]=1&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/automation-condition-group-operator"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "mlmycabslbflukoh",
    "sortBy": "kotajfvkcoilufyvmyd",
    "sortOrder": "asc",
    "filter[search]": "luvpbwohkdudiwyp",
    "filter[active]": "1",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/automation-condition-group-operator',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'mlmycabslbflukoh',
            'sortBy' => 'kotajfvkcoilufyvmyd',
            'sortOrder' => 'asc',
            'filter[search]' => 'luvpbwohkdudiwyp',
            'filter[active]' => '1',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/automation-condition-group-operator'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'mlmycabslbflukoh',
  'sortBy': 'kotajfvkcoilufyvmyd',
  'sortOrder': 'asc',
  'filter[search]': 'luvpbwohkdudiwyp',
  'filter[active]': '1',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/automation-condition-group-operator?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/automation-condition-group-operator?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/automation-condition-group-operator?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/automation-condition-group-operator",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/automation-condition-group-operator

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: mlmycabslbflukoh

sortBy   string  optional  

Must not be greater than 255 characters. Example: kotajfvkcoilufyvmyd

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: luvpbwohkdudiwyp

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/automation-condition-operator

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/automation-condition-operator?page=1&perPage=20&sort=uwabjrkrhjsmowzgytvhg&sortBy=hjjdklyfspqucbaplyvhnlff&sortOrder=asc&filter[search]=vwzmbmoesnxwbbchjqi&filter[active]=1&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/automation-condition-operator"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "uwabjrkrhjsmowzgytvhg",
    "sortBy": "hjjdklyfspqucbaplyvhnlff",
    "sortOrder": "asc",
    "filter[search]": "vwzmbmoesnxwbbchjqi",
    "filter[active]": "1",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/automation-condition-operator',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'uwabjrkrhjsmowzgytvhg',
            'sortBy' => 'hjjdklyfspqucbaplyvhnlff',
            'sortOrder' => 'asc',
            'filter[search]' => 'vwzmbmoesnxwbbchjqi',
            'filter[active]' => '1',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/automation-condition-operator'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'uwabjrkrhjsmowzgytvhg',
  'sortBy': 'hjjdklyfspqucbaplyvhnlff',
  'sortOrder': 'asc',
  'filter[search]': 'vwzmbmoesnxwbbchjqi',
  'filter[active]': '1',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/automation-condition-operator?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/automation-condition-operator?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/automation-condition-operator?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/automation-condition-operator",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/automation-condition-operator

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: uwabjrkrhjsmowzgytvhg

sortBy   string  optional  

Must not be greater than 255 characters. Example: hjjdklyfspqucbaplyvhnlff

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: vwzmbmoesnxwbbchjqi

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/automation-event-source

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/automation-event-source?page=1&perPage=20&sort=eoejvnqsmfu&sortBy=grwgqrfarayd&sortOrder=desc&filter[search]=nnecwug&filter[active]=&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/automation-event-source"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "eoejvnqsmfu",
    "sortBy": "grwgqrfarayd",
    "sortOrder": "desc",
    "filter[search]": "nnecwug",
    "filter[active]": "",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/automation-event-source',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'eoejvnqsmfu',
            'sortBy' => 'grwgqrfarayd',
            'sortOrder' => 'desc',
            'filter[search]' => 'nnecwug',
            'filter[active]' => '',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/automation-event-source'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'eoejvnqsmfu',
  'sortBy': 'grwgqrfarayd',
  'sortOrder': 'desc',
  'filter[search]': 'nnecwug',
  'filter[active]': '',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/automation-event-source?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/automation-event-source?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/automation-event-source?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/automation-event-source",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/automation-event-source

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: eoejvnqsmfu

sortBy   string  optional  

Must not be greater than 255 characters. Example: grwgqrfarayd

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: nnecwug

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/automation-event-status

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/automation-event-status?page=1&perPage=20&sort=hjitwrqrlenurq&sortBy=kkcnudsbefguvrkd&sortOrder=asc&filter[search]=ewzduyhtbzpydi&filter[active]=&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/automation-event-status"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "hjitwrqrlenurq",
    "sortBy": "kkcnudsbefguvrkd",
    "sortOrder": "asc",
    "filter[search]": "ewzduyhtbzpydi",
    "filter[active]": "",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/automation-event-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'hjitwrqrlenurq',
            'sortBy' => 'kkcnudsbefguvrkd',
            'sortOrder' => 'asc',
            'filter[search]' => 'ewzduyhtbzpydi',
            'filter[active]' => '',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/automation-event-status'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'hjitwrqrlenurq',
  'sortBy': 'kkcnudsbefguvrkd',
  'sortOrder': 'asc',
  'filter[search]': 'ewzduyhtbzpydi',
  'filter[active]': '',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/automation-event-status?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/automation-event-status?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/automation-event-status?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/automation-event-status",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/automation-event-status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: hjitwrqrlenurq

sortBy   string  optional  

Must not be greater than 255 characters. Example: kkcnudsbefguvrkd

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: ewzduyhtbzpydi

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/automation-execution-status

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/automation-execution-status?page=1&perPage=20&sort=mydqcbmqpmbrqukvkpydhsj&sortBy=gjwparvbacqfmhoryoomh&sortOrder=desc&filter[search]=o&filter[active]=&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/automation-execution-status"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "mydqcbmqpmbrqukvkpydhsj",
    "sortBy": "gjwparvbacqfmhoryoomh",
    "sortOrder": "desc",
    "filter[search]": "o",
    "filter[active]": "",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/automation-execution-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'mydqcbmqpmbrqukvkpydhsj',
            'sortBy' => 'gjwparvbacqfmhoryoomh',
            'sortOrder' => 'desc',
            'filter[search]' => 'o',
            'filter[active]' => '',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/automation-execution-status'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'mydqcbmqpmbrqukvkpydhsj',
  'sortBy': 'gjwparvbacqfmhoryoomh',
  'sortOrder': 'desc',
  'filter[search]': 'o',
  'filter[active]': '',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/automation-execution-status?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/automation-execution-status?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/automation-execution-status?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/automation-execution-status",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/automation-execution-status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: mydqcbmqpmbrqukvkpydhsj

sortBy   string  optional  

Must not be greater than 255 characters. Example: gjwparvbacqfmhoryoomh

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: o

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/automation-match-status

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/automation-match-status?page=1&perPage=20&sort=klnagvpoiobqttvrymcqbnqbu&sortBy=nrcszlkyuoswtgh&sortOrder=desc&filter[search]=mctoafrvwd&filter[active]=&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/automation-match-status"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "klnagvpoiobqttvrymcqbnqbu",
    "sortBy": "nrcszlkyuoswtgh",
    "sortOrder": "desc",
    "filter[search]": "mctoafrvwd",
    "filter[active]": "",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/automation-match-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'klnagvpoiobqttvrymcqbnqbu',
            'sortBy' => 'nrcszlkyuoswtgh',
            'sortOrder' => 'desc',
            'filter[search]' => 'mctoafrvwd',
            'filter[active]' => '',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/automation-match-status'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'klnagvpoiobqttvrymcqbnqbu',
  'sortBy': 'nrcszlkyuoswtgh',
  'sortOrder': 'desc',
  'filter[search]': 'mctoafrvwd',
  'filter[active]': '',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/automation-match-status?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/automation-match-status?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/automation-match-status?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/automation-match-status",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/automation-match-status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: klnagvpoiobqttvrymcqbnqbu

sortBy   string  optional  

Must not be greater than 255 characters. Example: nrcszlkyuoswtgh

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: mctoafrvwd

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/automation-rule-status

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/automation-rule-status?page=1&perPage=20&sort=vxoxcldiyvbnf&sortBy=ia&sortOrder=asc&filter[search]=lpymxo&filter[active]=1&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/automation-rule-status"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "vxoxcldiyvbnf",
    "sortBy": "ia",
    "sortOrder": "asc",
    "filter[search]": "lpymxo",
    "filter[active]": "1",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/automation-rule-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'vxoxcldiyvbnf',
            'sortBy' => 'ia',
            'sortOrder' => 'asc',
            'filter[search]' => 'lpymxo',
            'filter[active]' => '1',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/automation-rule-status'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'vxoxcldiyvbnf',
  'sortBy': 'ia',
  'sortOrder': 'asc',
  'filter[search]': 'lpymxo',
  'filter[active]': '1',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/automation-rule-status?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/automation-rule-status?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/automation-rule-status?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/automation-rule-status",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/automation-rule-status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: vxoxcldiyvbnf

sortBy   string  optional  

Must not be greater than 255 characters. Example: ia

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: lpymxo

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/automation-trigger-subject

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/automation-trigger-subject?page=1&perPage=20&sort=tebwfsjohuuzhodzxeg&sortBy=cpxyhhkynoigodsbhkyjsuuce&sortOrder=desc&filter[search]=ihrp&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/automation-trigger-subject"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "tebwfsjohuuzhodzxeg",
    "sortBy": "cpxyhhkynoigodsbhkyjsuuce",
    "sortOrder": "desc",
    "filter[search]": "ihrp",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/automation-trigger-subject',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'tebwfsjohuuzhodzxeg',
            'sortBy' => 'cpxyhhkynoigodsbhkyjsuuce',
            'sortOrder' => 'desc',
            'filter[search]' => 'ihrp',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/automation-trigger-subject'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'tebwfsjohuuzhodzxeg',
  'sortBy': 'cpxyhhkynoigodsbhkyjsuuce',
  'sortOrder': 'desc',
  'filter[search]': 'ihrp',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/automation-trigger-subject?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/automation-trigger-subject?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/automation-trigger-subject?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/automation-trigger-subject",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/automation-trigger-subject

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: tebwfsjohuuzhodzxeg

sortBy   string  optional  

Must not be greater than 255 characters. Example: cpxyhhkynoigodsbhkyjsuuce

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: ihrp

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/automation-weather-metric

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/automation-weather-metric?page=1&perPage=20&sort=ructtx&sortBy=zwmbcowfsauognk&sortOrder=asc&filter[search]=e&filter[active]=&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/automation-weather-metric"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "ructtx",
    "sortBy": "zwmbcowfsauognk",
    "sortOrder": "asc",
    "filter[search]": "e",
    "filter[active]": "",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/automation-weather-metric',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'ructtx',
            'sortBy' => 'zwmbcowfsauognk',
            'sortOrder' => 'asc',
            'filter[search]' => 'e',
            'filter[active]' => '',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/automation-weather-metric'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'ructtx',
  'sortBy': 'zwmbcowfsauognk',
  'sortOrder': 'asc',
  'filter[search]': 'e',
  'filter[active]': '',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [
        {
            "slug": "wind-speed",
            "name": "Wind Speed",
            "description": ""
        },
        {
            "slug": "temperature",
            "name": "Temperature",
            "description": ""
        }
    ],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/automation-weather-metric?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/automation-weather-metric?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/automation-weather-metric?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/automation-weather-metric",
        "per_page": 20,
        "to": 2,
        "total": 2
    }
}
 

Request      

GET api/v1/type/automation-weather-metric

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: ructtx

sortBy   string  optional  

Must not be greater than 255 characters. Example: zwmbcowfsauognk

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: e

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/automation-webhook-auth

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/automation-webhook-auth?page=1&perPage=20&sort=mgcovdkwswvfm&sortBy=qmxiynklwrgqlbcdvxeu&sortOrder=asc&filter[search]=bldrgofxvwokadwvfjtfi&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/automation-webhook-auth"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "mgcovdkwswvfm",
    "sortBy": "qmxiynklwrgqlbcdvxeu",
    "sortOrder": "asc",
    "filter[search]": "bldrgofxvwokadwvfjtfi",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/automation-webhook-auth',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'mgcovdkwswvfm',
            'sortBy' => 'qmxiynklwrgqlbcdvxeu',
            'sortOrder' => 'asc',
            'filter[search]' => 'bldrgofxvwokadwvfjtfi',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/automation-webhook-auth'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'mgcovdkwswvfm',
  'sortBy': 'qmxiynklwrgqlbcdvxeu',
  'sortOrder': 'asc',
  'filter[search]': 'bldrgofxvwokadwvfjtfi',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/automation-webhook-auth?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/automation-webhook-auth?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/automation-webhook-auth?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/automation-webhook-auth",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/automation-webhook-auth

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: mgcovdkwswvfm

sortBy   string  optional  

Must not be greater than 255 characters. Example: qmxiynklwrgqlbcdvxeu

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: bldrgofxvwokadwvfjtfi

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/collector

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/collector?page=1&perPage=20&sort=egloxwobcvyvnuxcji&sortBy=h&sortOrder=desc&filter[search]=jxdrwcelmfbrfshxa&filter[active]=&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/collector"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "egloxwobcvyvnuxcji",
    "sortBy": "h",
    "sortOrder": "desc",
    "filter[search]": "jxdrwcelmfbrfshxa",
    "filter[active]": "",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/collector',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'egloxwobcvyvnuxcji',
            'sortBy' => 'h',
            'sortOrder' => 'desc',
            'filter[search]' => 'jxdrwcelmfbrfshxa',
            'filter[active]' => '',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/collector'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'egloxwobcvyvnuxcji',
  'sortBy': 'h',
  'sortOrder': 'desc',
  'filter[search]': 'jxdrwcelmfbrfshxa',
  'filter[active]': '',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/collector?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/collector?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/collector?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/collector",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/collector

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: egloxwobcvyvnuxcji

sortBy   string  optional  

Must not be greater than 255 characters. Example: h

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: jxdrwcelmfbrfshxa

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/collector-status

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/collector-status?page=1&perPage=20&sort=gwobdxuhdyngs&sortBy=vujkqaeotloqtbmbkhmghsgtw&sortOrder=desc&filter[search]=snyb&filter[active]=&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/collector-status"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "gwobdxuhdyngs",
    "sortBy": "vujkqaeotloqtbmbkhmghsgtw",
    "sortOrder": "desc",
    "filter[search]": "snyb",
    "filter[active]": "",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/collector-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'gwobdxuhdyngs',
            'sortBy' => 'vujkqaeotloqtbmbkhmghsgtw',
            'sortOrder' => 'desc',
            'filter[search]' => 'snyb',
            'filter[active]' => '',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/collector-status'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'gwobdxuhdyngs',
  'sortBy': 'vujkqaeotloqtbmbkhmghsgtw',
  'sortOrder': 'desc',
  'filter[search]': 'snyb',
  'filter[active]': '',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/collector-status?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/collector-status?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/collector-status?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/collector-status",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/collector-status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: gwobdxuhdyngs

sortBy   string  optional  

Must not be greater than 255 characters. Example: vujkqaeotloqtbmbkhmghsgtw

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: snyb

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/company-contact

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/company-contact?page=1&perPage=20&sort=apyngluhib&sortBy=zrmpcolunq&sortOrder=asc&filter[search]=jh&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/company-contact"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "apyngluhib",
    "sortBy": "zrmpcolunq",
    "sortOrder": "asc",
    "filter[search]": "jh",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/company-contact',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'apyngluhib',
            'sortBy' => 'zrmpcolunq',
            'sortOrder' => 'asc',
            'filter[search]' => 'jh',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/company-contact'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'apyngluhib',
  'sortBy': 'zrmpcolunq',
  'sortOrder': 'asc',
  'filter[search]': 'jh',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/company-contact?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/company-contact?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/company-contact?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/company-contact",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/company-contact

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: apyngluhib

sortBy   string  optional  

Must not be greater than 255 characters. Example: zrmpcolunq

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: jh

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/company-link-invite-status?page=1&perPage=20&sort=elpufpkem&sortBy=fcdjxjffjyyesfvdimcmvwpf&sortOrder=asc&filter[search]=ocfeuilgtimpn&filter[active]=&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/company-link-invite-status"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "elpufpkem",
    "sortBy": "fcdjxjffjyyesfvdimcmvwpf",
    "sortOrder": "asc",
    "filter[search]": "ocfeuilgtimpn",
    "filter[active]": "",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/company-link-invite-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'elpufpkem',
            'sortBy' => 'fcdjxjffjyyesfvdimcmvwpf',
            'sortOrder' => 'asc',
            'filter[search]' => 'ocfeuilgtimpn',
            'filter[active]' => '',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/company-link-invite-status'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'elpufpkem',
  'sortBy': 'fcdjxjffjyyesfvdimcmvwpf',
  'sortOrder': 'asc',
  'filter[search]': 'ocfeuilgtimpn',
  'filter[active]': '',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/company-link-invite-status?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/company-link-invite-status?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/company-link-invite-status?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/company-link-invite-status",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/company-link-status?page=1&perPage=20&sort=adavrgpuborfidxrixzylsn&sortBy=tvgfntshceojlo&sortOrder=desc&filter[search]=bwuglqcb&filter[active]=&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/company-link-status"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "adavrgpuborfidxrixzylsn",
    "sortBy": "tvgfntshceojlo",
    "sortOrder": "desc",
    "filter[search]": "bwuglqcb",
    "filter[active]": "",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/company-link-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'adavrgpuborfidxrixzylsn',
            'sortBy' => 'tvgfntshceojlo',
            'sortOrder' => 'desc',
            'filter[search]' => 'bwuglqcb',
            'filter[active]' => '',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/company-link-status'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'adavrgpuborfidxrixzylsn',
  'sortBy': 'tvgfntshceojlo',
  'sortOrder': 'desc',
  'filter[search]': 'bwuglqcb',
  'filter[active]': '',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/company-link-status?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/company-link-status?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/company-link-status?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/company-link-status",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

GET api/v1/type/data-deletion-audit-status

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/data-deletion-audit-status?page=1&perPage=20&sort=ckqdjvi&sortBy=dle&sortOrder=asc&filter[search]=sllmjnedhhkipnpmq&filter[active]=1&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/data-deletion-audit-status"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "ckqdjvi",
    "sortBy": "dle",
    "sortOrder": "asc",
    "filter[search]": "sllmjnedhhkipnpmq",
    "filter[active]": "1",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/data-deletion-audit-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'ckqdjvi',
            'sortBy' => 'dle',
            'sortOrder' => 'asc',
            'filter[search]' => 'sllmjnedhhkipnpmq',
            'filter[active]' => '1',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/data-deletion-audit-status'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'ckqdjvi',
  'sortBy': 'dle',
  'sortOrder': 'asc',
  'filter[search]': 'sllmjnedhhkipnpmq',
  'filter[active]': '1',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/data-deletion-audit-status?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/data-deletion-audit-status?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/data-deletion-audit-status?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/data-deletion-audit-status",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/data-deletion-audit-status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: ckqdjvi

sortBy   string  optional  

Must not be greater than 255 characters. Example: dle

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: sllmjnedhhkipnpmq

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/data-retention-data

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/data-retention-data?page=1&perPage=20&sort=mjhitiz&sortBy=lfyq&sortOrder=asc&filter[search]=d&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/data-retention-data"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "mjhitiz",
    "sortBy": "lfyq",
    "sortOrder": "asc",
    "filter[search]": "d",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/data-retention-data',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'mjhitiz',
            'sortBy' => 'lfyq',
            'sortOrder' => 'asc',
            'filter[search]' => 'd',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/data-retention-data'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'mjhitiz',
  'sortBy': 'lfyq',
  'sortOrder': 'asc',
  'filter[search]': 'd',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [
        {
            "slug": "device-messages",
            "name": "Device Messages",
            "description": ""
        },
        {
            "slug": "device-commands",
            "name": "Device Commands",
            "description": ""
        },
        {
            "slug": "automation-events",
            "name": "Automation Events",
            "description": "Automation events and their context data"
        },
        {
            "slug": "automation-executions",
            "name": "Automation Executions",
            "description": "Automation action executions and notification dispatches"
        }
    ],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/data-retention-data?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/data-retention-data?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/data-retention-data?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/data-retention-data",
        "per_page": 20,
        "to": 4,
        "total": 4
    }
}
 

Request      

GET api/v1/type/data-retention-data

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: mjhitiz

sortBy   string  optional  

Must not be greater than 255 characters. Example: lfyq

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: d

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/device-message-processing-status

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/device-message-processing-status?page=1&perPage=20&sort=ypcdgmasypbrtrnthcppaqgcg&sortBy=jsyrgfxpcumarqxua&sortOrder=desc&filter[search]=tuyotle&filter[active]=&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/device-message-processing-status"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "ypcdgmasypbrtrnthcppaqgcg",
    "sortBy": "jsyrgfxpcumarqxua",
    "sortOrder": "desc",
    "filter[search]": "tuyotle",
    "filter[active]": "",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/device-message-processing-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'ypcdgmasypbrtrnthcppaqgcg',
            'sortBy' => 'jsyrgfxpcumarqxua',
            'sortOrder' => 'desc',
            'filter[search]' => 'tuyotle',
            'filter[active]' => '',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/device-message-processing-status'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'ypcdgmasypbrtrnthcppaqgcg',
  'sortBy': 'jsyrgfxpcumarqxua',
  'sortOrder': 'desc',
  'filter[search]': 'tuyotle',
  'filter[active]': '',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/device-message-processing-status?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/device-message-processing-status?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/device-message-processing-status?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/device-message-processing-status",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/device-message-processing-status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: ypcdgmasypbrtrnthcppaqgcg

sortBy   string  optional  

Must not be greater than 255 characters. Example: jsyrgfxpcumarqxua

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: tuyotle

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/failure

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/failure?page=1&perPage=20&sort=anfizvbk&sortBy=tfkvhrjitqfeyyuxqztmrhn&sortOrder=asc&filter[search]=rcj&filter[active]=1&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/failure"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "anfizvbk",
    "sortBy": "tfkvhrjitqfeyyuxqztmrhn",
    "sortOrder": "asc",
    "filter[search]": "rcj",
    "filter[active]": "1",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/failure',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'anfizvbk',
            'sortBy' => 'tfkvhrjitqfeyyuxqztmrhn',
            'sortOrder' => 'asc',
            'filter[search]' => 'rcj',
            'filter[active]' => '1',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/failure'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'anfizvbk',
  'sortBy': 'tfkvhrjitqfeyyuxqztmrhn',
  'sortOrder': 'asc',
  'filter[search]': 'rcj',
  'filter[active]': '1',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/failure?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/failure?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/failure?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/failure",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/failure

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: anfizvbk

sortBy   string  optional  

Must not be greater than 255 characters. Example: tfkvhrjitqfeyyuxqztmrhn

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: rcj

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/invitation-status

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/invitation-status?page=1&perPage=20&sort=nxhxdarhqarjqesn&sortBy=srkty&sortOrder=asc&filter[search]=hcuhglkbenpidbcxfuqgkverl&filter[active]=&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/invitation-status"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "nxhxdarhqarjqesn",
    "sortBy": "srkty",
    "sortOrder": "asc",
    "filter[search]": "hcuhglkbenpidbcxfuqgkverl",
    "filter[active]": "",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/invitation-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'nxhxdarhqarjqesn',
            'sortBy' => 'srkty',
            'sortOrder' => 'asc',
            'filter[search]' => 'hcuhglkbenpidbcxfuqgkverl',
            'filter[active]' => '',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/invitation-status'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'nxhxdarhqarjqesn',
  'sortBy': 'srkty',
  'sortOrder': 'asc',
  'filter[search]': 'hcuhglkbenpidbcxfuqgkverl',
  'filter[active]': '',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/invitation-status?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/invitation-status?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/invitation-status?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/invitation-status",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/invitation-status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: nxhxdarhqarjqesn

sortBy   string  optional  

Must not be greater than 255 characters. Example: srkty

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: hcuhglkbenpidbcxfuqgkverl

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/ip

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/ip?page=1&perPage=20&sort=drdfougftpbxegzhhnpcnk&sortBy=oazdlburhctwnl&sortOrder=asc&filter[search]=ufzwlwhafgfiydt&filter[active]=&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/ip"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "drdfougftpbxegzhhnpcnk",
    "sortBy": "oazdlburhctwnl",
    "sortOrder": "asc",
    "filter[search]": "ufzwlwhafgfiydt",
    "filter[active]": "",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/ip',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'drdfougftpbxegzhhnpcnk',
            'sortBy' => 'oazdlburhctwnl',
            'sortOrder' => 'asc',
            'filter[search]' => 'ufzwlwhafgfiydt',
            'filter[active]' => '',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/ip'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'drdfougftpbxegzhhnpcnk',
  'sortBy': 'oazdlburhctwnl',
  'sortOrder': 'asc',
  'filter[search]': 'ufzwlwhafgfiydt',
  'filter[active]': '',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/ip?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/ip?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/ip?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/ip",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/ip

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: drdfougftpbxegzhhnpcnk

sortBy   string  optional  

Must not be greater than 255 characters. Example: oazdlburhctwnl

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: ufzwlwhafgfiydt

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/mime-type-list

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/mime-type-list?page=1&perPage=20&sort=lueq&sortBy=dqgy&sortOrder=desc&filter[search]=xfqqfusnfjcqlxktxyd&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/mime-type-list"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "lueq",
    "sortBy": "dqgy",
    "sortOrder": "desc",
    "filter[search]": "xfqqfusnfjcqlxktxyd",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/mime-type-list',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'lueq',
            'sortBy' => 'dqgy',
            'sortOrder' => 'desc',
            'filter[search]' => 'xfqqfusnfjcqlxktxyd',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/mime-type-list'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'lueq',
  'sortBy': 'dqgy',
  'sortOrder': 'desc',
  'filter[search]': 'xfqqfusnfjcqlxktxyd',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/mime-type-list?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/mime-type-list?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/mime-type-list?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/mime-type-list",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/mime-type-list

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: lueq

sortBy   string  optional  

Must not be greater than 255 characters. Example: dqgy

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: xfqqfusnfjcqlxktxyd

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/mobile-app-version

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/mobile-app-version?page=1&perPage=20&sort=iefqudev&sortBy=quzug&sortOrder=asc&filter[search]=u&filter[active]=&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/mobile-app-version"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "iefqudev",
    "sortBy": "quzug",
    "sortOrder": "asc",
    "filter[search]": "u",
    "filter[active]": "",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/mobile-app-version',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'iefqudev',
            'sortBy' => 'quzug',
            'sortOrder' => 'asc',
            'filter[search]' => 'u',
            'filter[active]' => '',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/mobile-app-version'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'iefqudev',
  'sortBy': 'quzug',
  'sortOrder': 'asc',
  'filter[search]': 'u',
  'filter[active]': '',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/mobile-app-version?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/mobile-app-version?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/mobile-app-version?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/mobile-app-version",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/mobile-app-version

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: iefqudev

sortBy   string  optional  

Must not be greater than 255 characters. Example: quzug

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: u

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/mobile-audit-action

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/mobile-audit-action?page=1&perPage=20&sort=jdbpifinqzjksapv&sortBy=zchjerznmyzijiabckbnzs&sortOrder=asc&filter[search]=yunrirsv&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/mobile-audit-action"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "jdbpifinqzjksapv",
    "sortBy": "zchjerznmyzijiabckbnzs",
    "sortOrder": "asc",
    "filter[search]": "yunrirsv",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/mobile-audit-action',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'jdbpifinqzjksapv',
            'sortBy' => 'zchjerznmyzijiabckbnzs',
            'sortOrder' => 'asc',
            'filter[search]' => 'yunrirsv',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/mobile-audit-action'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'jdbpifinqzjksapv',
  'sortBy': 'zchjerznmyzijiabckbnzs',
  'sortOrder': 'asc',
  'filter[search]': 'yunrirsv',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/mobile-audit-action?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/mobile-audit-action?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/mobile-audit-action?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/mobile-audit-action",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/mobile-audit-action

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: jdbpifinqzjksapv

sortBy   string  optional  

Must not be greater than 255 characters. Example: zchjerznmyzijiabckbnzs

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: yunrirsv

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/mobile-audit-connection

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/mobile-audit-connection?page=1&perPage=20&sort=qqmkygtwfjllvfxszwkfgfywc&sortBy=ohkwtmxksfseuyakdtfq&sortOrder=desc&filter[search]=ajxsopdpncn&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/mobile-audit-connection"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "qqmkygtwfjllvfxszwkfgfywc",
    "sortBy": "ohkwtmxksfseuyakdtfq",
    "sortOrder": "desc",
    "filter[search]": "ajxsopdpncn",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/mobile-audit-connection',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'qqmkygtwfjllvfxszwkfgfywc',
            'sortBy' => 'ohkwtmxksfseuyakdtfq',
            'sortOrder' => 'desc',
            'filter[search]' => 'ajxsopdpncn',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/mobile-audit-connection'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'qqmkygtwfjllvfxszwkfgfywc',
  'sortBy': 'ohkwtmxksfseuyakdtfq',
  'sortOrder': 'desc',
  'filter[search]': 'ajxsopdpncn',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/mobile-audit-connection?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/mobile-audit-connection?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/mobile-audit-connection?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/mobile-audit-connection",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/mobile-audit-connection

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: qqmkygtwfjllvfxszwkfgfywc

sortBy   string  optional  

Must not be greater than 255 characters. Example: ohkwtmxksfseuyakdtfq

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: ajxsopdpncn

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/mobile-audit-event

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/mobile-audit-event?page=1&perPage=20&sort=mhtmansoeywsddpkqwt&sortBy=zkukjuedavmzftitwyxf&sortOrder=asc&filter[search]=usmikohumbodtuqbxub&filter[active]=&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/mobile-audit-event"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "mhtmansoeywsddpkqwt",
    "sortBy": "zkukjuedavmzftitwyxf",
    "sortOrder": "asc",
    "filter[search]": "usmikohumbodtuqbxub",
    "filter[active]": "",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/mobile-audit-event',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'mhtmansoeywsddpkqwt',
            'sortBy' => 'zkukjuedavmzftitwyxf',
            'sortOrder' => 'asc',
            'filter[search]' => 'usmikohumbodtuqbxub',
            'filter[active]' => '',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/mobile-audit-event'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'mhtmansoeywsddpkqwt',
  'sortBy': 'zkukjuedavmzftitwyxf',
  'sortOrder': 'asc',
  'filter[search]': 'usmikohumbodtuqbxub',
  'filter[active]': '',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/mobile-audit-event?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/mobile-audit-event?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/mobile-audit-event?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/mobile-audit-event",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/mobile-audit-event

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: mhtmansoeywsddpkqwt

sortBy   string  optional  

Must not be greater than 255 characters. Example: zkukjuedavmzftitwyxf

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: usmikohumbodtuqbxub

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/mobile-audit-result-status

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/mobile-audit-result-status?page=1&perPage=20&sort=c&sortBy=owfidxsnqua&sortOrder=asc&filter[search]=uqygneebtrxehlfgaj&filter[active]=1&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/mobile-audit-result-status"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "c",
    "sortBy": "owfidxsnqua",
    "sortOrder": "asc",
    "filter[search]": "uqygneebtrxehlfgaj",
    "filter[active]": "1",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/mobile-audit-result-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'c',
            'sortBy' => 'owfidxsnqua',
            'sortOrder' => 'asc',
            'filter[search]' => 'uqygneebtrxehlfgaj',
            'filter[active]' => '1',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/mobile-audit-result-status'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'c',
  'sortBy': 'owfidxsnqua',
  'sortOrder': 'asc',
  'filter[search]': 'uqygneebtrxehlfgaj',
  'filter[active]': '1',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/mobile-audit-result-status?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/mobile-audit-result-status?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/mobile-audit-result-status?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/mobile-audit-result-status",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/mobile-audit-result-status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: c

sortBy   string  optional  

Must not be greater than 255 characters. Example: owfidxsnqua

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: uqygneebtrxehlfgaj

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/mobile-build-number

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/mobile-build-number?page=1&perPage=20&sort=umqxnk&sortBy=wj&sortOrder=asc&filter[search]=lbfwlnfqjc&filter[active]=&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/mobile-build-number"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "umqxnk",
    "sortBy": "wj",
    "sortOrder": "asc",
    "filter[search]": "lbfwlnfqjc",
    "filter[active]": "",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/mobile-build-number',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'umqxnk',
            'sortBy' => 'wj',
            'sortOrder' => 'asc',
            'filter[search]' => 'lbfwlnfqjc',
            'filter[active]' => '',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/mobile-build-number'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'umqxnk',
  'sortBy': 'wj',
  'sortOrder': 'asc',
  'filter[search]': 'lbfwlnfqjc',
  'filter[active]': '',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/mobile-build-number?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/mobile-build-number?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/mobile-build-number?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/mobile-build-number",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/mobile-build-number

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: umqxnk

sortBy   string  optional  

Must not be greater than 255 characters. Example: wj

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: lbfwlnfqjc

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/mobile-device-model

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/mobile-device-model?page=1&perPage=20&sort=xalzyiolvgggkysepuzcer&sortBy=rxnyduiqwpkvthstjqjcmp&sortOrder=asc&filter[search]=w&filter[active]=&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/mobile-device-model"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "xalzyiolvgggkysepuzcer",
    "sortBy": "rxnyduiqwpkvthstjqjcmp",
    "sortOrder": "asc",
    "filter[search]": "w",
    "filter[active]": "",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/mobile-device-model',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'xalzyiolvgggkysepuzcer',
            'sortBy' => 'rxnyduiqwpkvthstjqjcmp',
            'sortOrder' => 'asc',
            'filter[search]' => 'w',
            'filter[active]' => '',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/mobile-device-model'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'xalzyiolvgggkysepuzcer',
  'sortBy': 'rxnyduiqwpkvthstjqjcmp',
  'sortOrder': 'asc',
  'filter[search]': 'w',
  'filter[active]': '',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/mobile-device-model?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/mobile-device-model?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/mobile-device-model?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/mobile-device-model",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/mobile-device-model

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: xalzyiolvgggkysepuzcer

sortBy   string  optional  

Must not be greater than 255 characters. Example: rxnyduiqwpkvthstjqjcmp

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: w

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/mobile-operator-label

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/mobile-operator-label?page=1&perPage=20&sort=ufyauvjkfgbfsfvcvhwqem&sortBy=tlgk&sortOrder=asc&filter[search]=ycpdbifvpjhkgijtz&filter[active]=&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/mobile-operator-label"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "ufyauvjkfgbfsfvcvhwqem",
    "sortBy": "tlgk",
    "sortOrder": "asc",
    "filter[search]": "ycpdbifvpjhkgijtz",
    "filter[active]": "",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/mobile-operator-label',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'ufyauvjkfgbfsfvcvhwqem',
            'sortBy' => 'tlgk',
            'sortOrder' => 'asc',
            'filter[search]' => 'ycpdbifvpjhkgijtz',
            'filter[active]' => '',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/mobile-operator-label'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'ufyauvjkfgbfsfvcvhwqem',
  'sortBy': 'tlgk',
  'sortOrder': 'asc',
  'filter[search]': 'ycpdbifvpjhkgijtz',
  'filter[active]': '',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/mobile-operator-label?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/mobile-operator-label?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/mobile-operator-label?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/mobile-operator-label",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/mobile-operator-label

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: ufyauvjkfgbfsfvcvhwqem

sortBy   string  optional  

Must not be greater than 255 characters. Example: tlgk

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: ycpdbifvpjhkgijtz

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/mobile-os-version

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/mobile-os-version?page=1&perPage=20&sort=cfjspkytaurk&sortBy=xthzgbtryokkocufumdy&sortOrder=desc&filter[search]=iqbxwpwzqioh&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/mobile-os-version"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "cfjspkytaurk",
    "sortBy": "xthzgbtryokkocufumdy",
    "sortOrder": "desc",
    "filter[search]": "iqbxwpwzqioh",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/mobile-os-version',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'cfjspkytaurk',
            'sortBy' => 'xthzgbtryokkocufumdy',
            'sortOrder' => 'desc',
            'filter[search]' => 'iqbxwpwzqioh',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/mobile-os-version'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'cfjspkytaurk',
  'sortBy': 'xthzgbtryokkocufumdy',
  'sortOrder': 'desc',
  'filter[search]': 'iqbxwpwzqioh',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/mobile-os-version?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/mobile-os-version?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/mobile-os-version?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/mobile-os-version",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/mobile-os-version

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: cfjspkytaurk

sortBy   string  optional  

Must not be greater than 255 characters. Example: xthzgbtryokkocufumdy

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: iqbxwpwzqioh

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/mobile-platform

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/mobile-platform?page=1&perPage=20&sort=iennnggxsadrhyrnrq&sortBy=ubg&sortOrder=asc&filter[search]=gcbcxxmnmambuzrmudyukmva&filter[active]=&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/mobile-platform"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "iennnggxsadrhyrnrq",
    "sortBy": "ubg",
    "sortOrder": "asc",
    "filter[search]": "gcbcxxmnmambuzrmudyukmva",
    "filter[active]": "",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/mobile-platform',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'iennnggxsadrhyrnrq',
            'sortBy' => 'ubg',
            'sortOrder' => 'asc',
            'filter[search]' => 'gcbcxxmnmambuzrmudyukmva',
            'filter[active]' => '',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/mobile-platform'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'iennnggxsadrhyrnrq',
  'sortBy': 'ubg',
  'sortOrder': 'asc',
  'filter[search]': 'gcbcxxmnmambuzrmudyukmva',
  'filter[active]': '',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/mobile-platform?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/mobile-platform?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/mobile-platform?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/mobile-platform",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/mobile-platform

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: iennnggxsadrhyrnrq

sortBy   string  optional  

Must not be greater than 255 characters. Example: ubg

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: gcbcxxmnmambuzrmudyukmva

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/note

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/note?page=1&perPage=20&sort=dnakedeijdkwkyivorcnkym&sortBy=iedjubplp&sortOrder=desc&filter[search]=pabnqxgqchx&filter[active]=&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/note"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "dnakedeijdkwkyivorcnkym",
    "sortBy": "iedjubplp",
    "sortOrder": "desc",
    "filter[search]": "pabnqxgqchx",
    "filter[active]": "",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/note',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'dnakedeijdkwkyivorcnkym',
            'sortBy' => 'iedjubplp',
            'sortOrder' => 'desc',
            'filter[search]' => 'pabnqxgqchx',
            'filter[active]' => '',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/note'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'dnakedeijdkwkyivorcnkym',
  'sortBy': 'iedjubplp',
  'sortOrder': 'desc',
  'filter[search]': 'pabnqxgqchx',
  'filter[active]': '',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/note?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/note?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/note?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/note",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/note

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: dnakedeijdkwkyivorcnkym

sortBy   string  optional  

Must not be greater than 255 characters. Example: iedjubplp

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: pabnqxgqchx

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/notification-channel

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/notification-channel?page=1&perPage=20&sort=iwivarbkpfsquxxnnqvt&sortBy=vw&sortOrder=desc&filter[search]=aahoh&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/notification-channel"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "iwivarbkpfsquxxnnqvt",
    "sortBy": "vw",
    "sortOrder": "desc",
    "filter[search]": "aahoh",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/notification-channel',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'iwivarbkpfsquxxnnqvt',
            'sortBy' => 'vw',
            'sortOrder' => 'desc',
            'filter[search]' => 'aahoh',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/notification-channel'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'iwivarbkpfsquxxnnqvt',
  'sortBy': 'vw',
  'sortOrder': 'desc',
  'filter[search]': 'aahoh',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/notification-channel?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/notification-channel?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/notification-channel?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/notification-channel",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/notification-channel

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: iwivarbkpfsquxxnnqvt

sortBy   string  optional  

Must not be greater than 255 characters. Example: vw

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: aahoh

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/notification-delivery-status

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/notification-delivery-status?page=1&perPage=20&sort=ggsekyupftjizvwkcnohhqm&sortBy=ieekmekcwjjrukj&sortOrder=desc&filter[search]=axnoxgy&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/notification-delivery-status"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "ggsekyupftjizvwkcnohhqm",
    "sortBy": "ieekmekcwjjrukj",
    "sortOrder": "desc",
    "filter[search]": "axnoxgy",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/notification-delivery-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'ggsekyupftjizvwkcnohhqm',
            'sortBy' => 'ieekmekcwjjrukj',
            'sortOrder' => 'desc',
            'filter[search]' => 'axnoxgy',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/notification-delivery-status'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'ggsekyupftjizvwkcnohhqm',
  'sortBy': 'ieekmekcwjjrukj',
  'sortOrder': 'desc',
  'filter[search]': 'axnoxgy',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/notification-delivery-status?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/notification-delivery-status?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/notification-delivery-status?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/notification-delivery-status",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/notification-delivery-status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: ggsekyupftjizvwkcnohhqm

sortBy   string  optional  

Must not be greater than 255 characters. Example: ieekmekcwjjrukj

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: axnoxgy

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/notification-template-format

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/notification-template-format?page=1&perPage=20&sort=hi&sortBy=vlch&sortOrder=desc&filter[search]=khaiylqmx&filter[active]=&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/notification-template-format"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "hi",
    "sortBy": "vlch",
    "sortOrder": "desc",
    "filter[search]": "khaiylqmx",
    "filter[active]": "",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/notification-template-format',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'hi',
            'sortBy' => 'vlch',
            'sortOrder' => 'desc',
            'filter[search]' => 'khaiylqmx',
            'filter[active]' => '',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/notification-template-format'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'hi',
  'sortBy': 'vlch',
  'sortOrder': 'desc',
  'filter[search]': 'khaiylqmx',
  'filter[active]': '',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/notification-template-format?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/notification-template-format?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/notification-template-format?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/notification-template-format",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/notification-template-format

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: hi

sortBy   string  optional  

Must not be greater than 255 characters. Example: vlch

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: khaiylqmx

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/permission

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/permission?page=1&perPage=20&sort=unazabqeojsabekcekglfur&sortBy=qojasjeurieqscf&sortOrder=asc&filter[search]=pxynistwlz&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/permission"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "unazabqeojsabekcekglfur",
    "sortBy": "qojasjeurieqscf",
    "sortOrder": "asc",
    "filter[search]": "pxynistwlz",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/permission',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'unazabqeojsabekcekglfur',
            'sortBy' => 'qojasjeurieqscf',
            'sortOrder' => 'asc',
            'filter[search]' => 'pxynistwlz',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/permission'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'unazabqeojsabekcekglfur',
  'sortBy': 'qojasjeurieqscf',
  'sortOrder': 'asc',
  'filter[search]': 'pxynistwlz',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/type/permission

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: unazabqeojsabekcekglfur

sortBy   string  optional  

Must not be greater than 255 characters. Example: qojasjeurieqscf

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: pxynistwlz

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/rma-status

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/rma-status?page=1&perPage=20&sort=cilwxevzruu&sortBy=onwuhvmlrjnakljwhqovbisf&sortOrder=desc&filter[search]=brrycgb&filter[active]=&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/rma-status"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "cilwxevzruu",
    "sortBy": "onwuhvmlrjnakljwhqovbisf",
    "sortOrder": "desc",
    "filter[search]": "brrycgb",
    "filter[active]": "",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/rma-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'cilwxevzruu',
            'sortBy' => 'onwuhvmlrjnakljwhqovbisf',
            'sortOrder' => 'desc',
            'filter[search]' => 'brrycgb',
            'filter[active]' => '',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/rma-status'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'cilwxevzruu',
  'sortBy': 'onwuhvmlrjnakljwhqovbisf',
  'sortOrder': 'desc',
  'filter[search]': 'brrycgb',
  'filter[active]': '',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/rma-status?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/rma-status?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/rma-status?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/rma-status",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/rma-status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: cilwxevzruu

sortBy   string  optional  

Must not be greater than 255 characters. Example: onwuhvmlrjnakljwhqovbisf

sortOrder   string  optional  

Example: desc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: brrycgb

filter.active   boolean  optional  

Example: false

filter.enabled   boolean  optional  

Example: false

GET api/v1/type/role

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/role?page=1&perPage=20&sort=smot&sortBy=dck&sortOrder=asc&filter[search]=uvcxpkxpnc&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/role"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "smot",
    "sortBy": "dck",
    "sortOrder": "asc",
    "filter[search]": "uvcxpkxpnc",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/role',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'smot',
            'sortBy' => 'dck',
            'sortOrder' => 'asc',
            'filter[search]' => 'uvcxpkxpnc',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/role'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'smot',
  'sortBy': 'dck',
  'sortOrder': 'asc',
  'filter[search]': 'uvcxpkxpnc',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/type/role

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: smot

sortBy   string  optional  

Must not be greater than 255 characters. Example: dck

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: uvcxpkxpnc

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/user-address

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/user-address?page=1&perPage=20&sort=jsqek&sortBy=s&sortOrder=asc&filter[search]=nfuzgxynhwowyvrnjqhfuzufj&filter[active]=1&filter[enabled]=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/user-address"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "jsqek",
    "sortBy": "s",
    "sortOrder": "asc",
    "filter[search]": "nfuzgxynhwowyvrnjqhfuzufj",
    "filter[active]": "1",
    "filter[enabled]": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/user-address',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'jsqek',
            'sortBy' => 's',
            'sortOrder' => 'asc',
            'filter[search]' => 'nfuzgxynhwowyvrnjqhfuzufj',
            'filter[active]' => '1',
            'filter[enabled]' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/user-address'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'jsqek',
  'sortBy': 's',
  'sortOrder': 'asc',
  'filter[search]': 'nfuzgxynhwowyvrnjqhfuzufj',
  'filter[active]': '1',
  'filter[enabled]': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/user-address?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/user-address?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/user-address?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/user-address",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/user-address

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: jsqek

sortBy   string  optional  

Must not be greater than 255 characters. Example: s

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: nfuzgxynhwowyvrnjqhfuzufj

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: true

GET api/v1/type/warranty

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/warranty?page=1&perPage=20&sort=adnulcz&sortBy=khylmnqnwy&sortOrder=asc&filter[search]=szelqpxtq&filter[active]=1&filter[enabled]=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/warranty"
);

const params = {
    "page": "1",
    "perPage": "20",
    "sort": "adnulcz",
    "sortBy": "khylmnqnwy",
    "sortOrder": "asc",
    "filter[search]": "szelqpxtq",
    "filter[active]": "1",
    "filter[enabled]": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/warranty',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '20',
            'sort' => 'adnulcz',
            'sortBy' => 'khylmnqnwy',
            'sortOrder' => 'asc',
            'filter[search]' => 'szelqpxtq',
            'filter[active]' => '1',
            'filter[enabled]' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/warranty'
params = {
  'page': '1',
  'perPage': '20',
  'sort': 'adnulcz',
  'sortBy': 'khylmnqnwy',
  'sortOrder': 'asc',
  'filter[search]': 'szelqpxtq',
  'filter[active]': '1',
  'filter[enabled]': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [],
    "links": {
        "first": "https://tracklabsolar.com/api/v1/type/warranty?page=1",
        "last": "https://tracklabsolar.com/api/v1/type/warranty?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": null,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://tracklabsolar.com/api/v1/type/warranty?page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "page": null,
                "active": false
            }
        ],
        "path": "https://tracklabsolar.com/api/v1/type/warranty",
        "per_page": 20,
        "to": null,
        "total": 0
    }
}
 

Request      

GET api/v1/type/warranty

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 20

sort   string  optional  

Must not be greater than 255 characters. Example: adnulcz

sortBy   string  optional  

Must not be greater than 255 characters. Example: khylmnqnwy

sortOrder   string  optional  

Example: asc

filter   object  optional  
filter.search   string  optional  

Must not be greater than 255 characters. Example: szelqpxtq

filter.active   boolean  optional  

Example: true

filter.enabled   boolean  optional  

Example: false

Get Country Types

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/country" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/country"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/country',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/country'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "isoCode": "",
            "isoThreeCode": "",
            "name": "Unknown",
            "officialName": "Unknown",
            "emoji": "",
            "enabled": true,
            "isActive": false
        },
        {
            "isoCode": "",
            "isoThreeCode": "",
            "name": "Unknown",
            "officialName": "Unknown",
            "emoji": "",
            "enabled": true,
            "isActive": false
        }
    ]
}
 

Request      

GET api/v1/type/country

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get Detailed Country Types

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/country/detailed" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/country/detailed"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/country/detailed',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/country/detailed'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "isoCode": "",
            "isoThreeCode": "",
            "isoNumeric": 0,
            "name": "Unknown",
            "officialName": "Unknown",
            "emoji": "",
            "enabled": true,
            "isActive": false,
            "latitude": 0,
            "longitude": 0,
            "latitudeMin": 0,
            "latitudeMax": 0,
            "longitudeMin": 0,
            "longitudeMax": 0,
            "currencies": [
                {
                    "code": "UNKNOWN",
                    "name": "Unknown",
                    "symbol": "ƒ",
                    "decimalPlaces": 0,
                    "isActive": false
                }
            ],
            "languages": [
                {
                    "code": null,
                    "name": "Unknown",
                    "nativeName": null,
                    "isActive": false
                }
            ],
            "timezones": [
                {
                    "identifier": "Unknown",
                    "name": "Unknown",
                    "utcOffset": 0,
                    "isActive": false
                }
            ]
        },
        {
            "isoCode": "",
            "isoThreeCode": "",
            "isoNumeric": 0,
            "name": "Unknown",
            "officialName": "Unknown",
            "emoji": "",
            "enabled": true,
            "isActive": false,
            "latitude": 0,
            "longitude": 0,
            "latitudeMin": 0,
            "latitudeMax": 0,
            "longitudeMin": 0,
            "longitudeMax": 0,
            "currencies": [
                {
                    "code": "UNKNOWN",
                    "name": "Unknown",
                    "symbol": "ƒ",
                    "decimalPlaces": 0,
                    "isActive": false
                }
            ],
            "languages": [
                {
                    "code": null,
                    "name": "Unknown",
                    "nativeName": null,
                    "isActive": false
                }
            ],
            "timezones": [
                {
                    "identifier": "Unknown",
                    "name": "Unknown",
                    "utcOffset": 0,
                    "isActive": false
                }
            ]
        }
    ]
}
 

Request      

GET api/v1/type/country/detailed

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get Single Country Full Details

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/country/ZA" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/country/ZA"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/country/ZA',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/country/ZA'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "isoCode": "",
        "isoThreeCode": "",
        "isoNumeric": 0,
        "name": "Unknown",
        "officialName": "Unknown",
        "emoji": "",
        "enabled": true,
        "isActive": false,
        "latitude": 0,
        "longitude": 0,
        "latitudeMin": 0,
        "latitudeMax": 0,
        "longitudeMin": 0,
        "longitudeMax": 0,
        "continent": {
            "name": "None"
        },
        "currencies": [
            {
                "code": "UNKNOWN",
                "name": "Unknown",
                "symbol": "ƒ",
                "decimalPlaces": 0,
                "isActive": false
            }
        ],
        "languages": [
            {
                "code": null,
                "name": "Unknown",
                "nativeName": null,
                "isActive": false
            }
        ],
        "timezones": [
            {
                "identifier": "Unknown",
                "name": "Unknown",
                "utcOffset": 0,
                "isActive": false
            }
        ],
        "regions": [
            {
                "name": "Unknown",
                "isActive": false
            }
        ],
        "extras": null
    }
}
 

Request      

GET api/v1/type/country/{isoCode}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

isoCode   string   

The ISO 3166-1 alpha-2 country code. Example: ZA

Get Data Types

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/data" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/data"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/data',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/data'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "slug": "unknown",
            "name": "unknown",
            "description": ""
        },
        {
            "slug": "unknown",
            "name": "unknown",
            "description": ""
        }
    ]
}
 

Example response (200):


{
    "data": [
        {
            "slug": "numeric",
            "name": "Numeric",
            "description": "Numeric data type"
        },
        {
            "slug": "string",
            "name": "String",
            "description": "String data type"
        }
    ]
}
 

Request      

GET api/v1/type/data

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get Data Unit Types

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/data/units" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/data/units"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/data/units',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/data/units'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "slug": "unknown",
            "dataTypeSlug": "unknown",
            "name": "Unknown",
            "unit": "",
            "description": ""
        },
        {
            "slug": "unknown",
            "dataTypeSlug": "unknown",
            "name": "Unknown",
            "unit": "",
            "description": ""
        }
    ]
}
 

Request      

GET api/v1/type/data/units

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get Parameter Types

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/data/parameter" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/data/parameter"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/data/parameter',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/data/parameter'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "slug": "unknown",
            "name": "Unknown",
            "description": "",
            "dataUnitSlug": "unknown",
            "dataTypeSlug": "unknown",
            "unit": "",
            "orderColumn": 0,
            "enabled": true,
            "isReadOnly": false,
            "collectorTypeSlug": null,
            "validation": [],
            "lookups": null
        },
        {
            "slug": "unknown",
            "name": "Unknown",
            "description": "",
            "dataUnitSlug": "unknown",
            "dataTypeSlug": "unknown",
            "unit": "",
            "orderColumn": 0,
            "enabled": true,
            "isReadOnly": false,
            "collectorTypeSlug": null,
            "validation": [],
            "lookups": null
        }
    ]
}
 

Example response (200):


{
    "data": [
        {
            "slug": "battery_level",
            "dataUnitSlug": "percentage",
            "dataTypeSlug": "numeric",
            "unit": "%",
            "name": "Battery Level",
            "description": "Device battery level"
        }
    ]
}
 

Request      

GET api/v1/type/data/parameter

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get Measurement Types

requires authentication

Retrieve all available measurement types for collectors.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/data/measurement" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/data/measurement"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/data/measurement',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/data/measurement'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "uuid": "550e8400-e29b-41d4-a716-446655440000",
            "name": "Temperature",
            "slug": "temperature",
            "description": "Temperature measurements",
            "data_type": {
                "uuid": "550e8400-e29b-41d4-a716-446655440000",
                "name": "Numeric",
                "slug": "numeric"
            },
            "data_unit": {
                "uuid": "550e8400-e29b-41d4-a716-446655440000",
                "name": "Celsius",
                "slug": "celsius",
                "symbol": "°C"
            }
        }
    ]
}
 

Request      

GET api/v1/type/data/measurement

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/type/data/measurement-aggregation

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/data/measurement-aggregation" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/data/measurement-aggregation"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/data/measurement-aggregation',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/data/measurement-aggregation'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": {
        "avg": {
            "slug": "avg",
            "name": "Average",
            "description": "Mean + stddev + kurtosis (default)",
            "orderColumn": 1,
            "requiresNumericData": true
        },
        "median": {
            "slug": "median",
            "name": "Median",
            "description": "Median (50th percentile)",
            "orderColumn": 2,
            "requiresNumericData": true
        },
        "min": {
            "slug": "min",
            "name": "Minimum",
            "description": "Minimum value in bucket",
            "orderColumn": 3,
            "requiresNumericData": true
        },
        "max": {
            "slug": "max",
            "name": "Maximum",
            "description": "Maximum value in bucket",
            "orderColumn": 4,
            "requiresNumericData": true
        },
        "sum": {
            "slug": "sum",
            "name": "Sum",
            "description": "Sum of all values",
            "orderColumn": 5,
            "requiresNumericData": true
        },
        "count": {
            "slug": "count",
            "name": "Count",
            "description": "Number of data points",
            "orderColumn": 6,
            "requiresNumericData": false
        },
        "first": {
            "slug": "first",
            "name": "First",
            "description": "First value by timestamp",
            "orderColumn": 7,
            "requiresNumericData": false
        },
        "last": {
            "slug": "last",
            "name": "Last",
            "description": "Last value by timestamp",
            "orderColumn": 8,
            "requiresNumericData": false
        }
    }
}
 

Request      

GET api/v1/type/data/measurement-aggregation

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/type/data/period

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/data/period" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/data/period"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/data/period',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/data/period'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": [
        {
            "slug": "none",
            "name": "No Aggregation",
            "interval": "00:00:01",
            "order": -10
        },
        {
            "slug": "1-minute",
            "name": "1 Minute",
            "interval": "00:01:00",
            "order": 0
        },
        {
            "slug": "10-minutes",
            "name": "10 Minutes",
            "interval": "00:10:00",
            "order": 10
        },
        {
            "slug": "1-hour",
            "name": "1 Hour",
            "interval": "01:00:00",
            "order": 20
        },
        {
            "slug": "4-hours",
            "name": "4 Hours",
            "interval": "04:00:00",
            "order": 30
        },
        {
            "slug": "12-hours",
            "name": "12 Hours",
            "interval": "12:00:00",
            "order": 40
        },
        {
            "slug": "1-day",
            "name": "1 Day",
            "interval": "1 day",
            "order": 50
        },
        {
            "slug": "1-week",
            "name": "1 Week",
            "interval": "7 days",
            "order": 60
        },
        {
            "slug": "1-month",
            "name": "1 Month",
            "interval": "1 mon",
            "order": 70
        }
    ]
}
 

Request      

GET api/v1/type/data/period

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/type/data/environment

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/data/environment" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/data/environment"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/data/environment',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/data/environment'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": {
        "production": {
            "slug": "production",
            "name": "Production",
            "description": "Production environment"
        },
        "staging": {
            "slug": "staging",
            "name": "Staging",
            "description": "Staging environment"
        },
        "development": {
            "slug": "development",
            "name": "Development",
            "description": "Development environment"
        }
    }
}
 

Request      

GET api/v1/type/data/environment

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/v1/type/data/device-message-processing-error

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/data/device-message-processing-error" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/data/device-message-processing-error"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/data/device-message-processing-error',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/data/device-message-processing-error'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "data": {
        "collector-not-found": {
            "slug": "collector-not-found",
            "name": "Collector Not Found",
            "description": "No collector found for the given serial number"
        },
        "database-error": {
            "slug": "database-error",
            "name": "Database Error",
            "description": "Database operation failed during processing"
        },
        "invalid-message-structure": {
            "slug": "invalid-message-structure",
            "name": "Invalid Message Structure",
            "description": "Message JSON structure is invalid or missing required fields"
        },
        "json-parsing-error": {
            "slug": "json-parsing-error",
            "name": "JSON Parsing Error",
            "description": "Failed to parse message JSON"
        },
        "measurement-type-not-found": {
            "slug": "measurement-type-not-found",
            "name": "Measurement Type Not Found",
            "description": "Measurement type slug not found in measurement types table"
        },
        "parameter-type-not-found": {
            "slug": "parameter-type-not-found",
            "name": "Parameter Type Not Found",
            "description": "Parameter type slug not found in parameter types table"
        }
    }
}
 

Request      

GET api/v1/type/data/device-message-processing-error

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get User Status Types

requires authentication

Returns all enabled user status types ordered by order_column.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/type/user-status" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/type/user-status"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/type/user-status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/type/user-status'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "slug": "pending",
            "name": "Pending",
            "enabled": true,
            "orderColumn": 1
        },
        {
            "slug": "pending",
            "name": "Pending",
            "enabled": true,
            "orderColumn": 1
        }
    ]
}
 

Example response (200):


{
    "data": [
        {
            "slug": "pending",
            "name": "Pending",
            "enabled": true,
            "orderColumn": 1
        },
        {
            "slug": "active",
            "name": "Active",
            "enabled": true,
            "orderColumn": 2
        }
    ]
}
 

Request      

GET api/v1/type/user-status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Handle an incoming registration request.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/register" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"companyName\": \"My Awesome Company\",
    \"firstName\": \"Jane\",
    \"lastName\": \"Smith\",
    \"email\": \"jane.smith@example.com\",
    \"password\": \"StrongPass123!@#\",
    \"countryIsoCode\": \"GB\",
    \"phoneNumber\": \"+447123456789\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/register"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "companyName": "My Awesome Company",
    "firstName": "Jane",
    "lastName": "Smith",
    "email": "jane.smith@example.com",
    "password": "StrongPass123!@#",
    "countryIsoCode": "GB",
    "phoneNumber": "+447123456789"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/register',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'companyName' => 'My Awesome Company',
            'firstName' => 'Jane',
            'lastName' => 'Smith',
            'email' => 'jane.smith@example.com',
            'password' => 'StrongPass123!@#',
            'countryIsoCode' => 'GB',
            'phoneNumber' => '+447123456789',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/register'
payload = {
    "companyName": "My Awesome Company",
    "firstName": "Jane",
    "lastName": "Smith",
    "email": "jane.smith@example.com",
    "password": "StrongPass123!@#",
    "countryIsoCode": "GB",
    "phoneNumber": "+447123456789"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201):


{
    "data": {
        "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
        "createdAt": "2025-11-12T20:27:08+00:00",
        "updatedAt": "2026-02-10T15:20:26+00:00",
        "defaultCompanySlug": null,
        "emailVerifiedAt": null,
        "defaultCountryIsoCode": "",
        "defaultCountryEmoji": "",
        "email": "liquid.ideas@gmail.com",
        "firstName": "Jo",
        "lastName": "Whitehouse",
        "phoneNumbers": [],
        "roles": [],
        "imgUrl": null,
        "imgThumbUrl": null,
        "imgLargeUrl": null,
        "imgUrlExpiresAt": null,
        "isActive": true,
        "disabledAt": null,
        "status": null,
        "statusName": null
    }
}
 

Request      

POST api/v1/register

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

companyName   string   

Name of the new company. Must be at least 2 characters. Example: My Awesome Company

firstName   string   

First name of the primary user. Must not be greater than 255 characters. Example: Jane

lastName   string   

Last name of the primary user. Must not be greater than 255 characters. Example: Smith

email   string   

Email address for the primary user. Must be a valid email address. Must not be greater than 255 characters. Example: jane.smith@example.com

password   string   

Password for the primary user (min 10 chars). Example: StrongPass123!@#

countryIsoCode   string   

ISO code of the user/company country. The iso_code of an existing record in the countries table. Example: GB

phoneNumber   string   

Phone number for the primary user. Must be at least 6 characters. Example: +447123456789

Handle an incoming password reset link request.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/forgot-password" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"user@example.com\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/forgot-password"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "user@example.com"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/forgot-password',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'user@example.com',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/forgot-password'
payload = {
    "email": "user@example.com"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "status": "We have emailed your password reset link."
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "email": [
            "We can't find a user with that email address."
        ]
    }
}
 

Request      

POST api/v1/forgot-password

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

email   string   

Email address to send the reset link to. Must be a valid email address. Example: user@example.com

Handle an incoming new password request.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/reset-password" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"token\": \"...\",
    \"email\": \"user@example.com\",
    \"password\": \"NewSecurePass123!\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/reset-password"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "token": "...",
    "email": "user@example.com",
    "password": "NewSecurePass123!"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/reset-password',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'token' => '...',
            'email' => 'user@example.com',
            'password' => 'NewSecurePass123!',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/reset-password'
payload = {
    "token": "...",
    "email": "user@example.com",
    "password": "NewSecurePass123!"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "status": "Your password has been reset."
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "email": [
            "We can't find a user with that email address."
        ]
    }
}
 

Request      

POST api/v1/reset-password

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

token   string   

The password reset token. Example: ...

email   string   

The email address associated with the token. Must be a valid email address. Example: user@example.com

password   string   

The new password. Example: NewSecurePass123!

Mark the user's email address as verified.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/verify-email/quas/dolor" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/verify-email/quas/dolor"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/verify-email/quas/dolor',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/verify-email/quas/dolor'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (302):

Show headers
cache-control: no-cache, private
location: https://tracklabsolar.com/emailVerification?error=invalid&msg=Invalid+verification+link
content-type: text/html; charset=utf-8
x-ratelimit-limit: 6
x-ratelimit-remaining: 1
vary: Origin
set-cookie: XSRF-TOKEN=eyJpdiI6IkpIZ0RPcFlMZ21WeEQ0NUM3NVpNQkE9PSIsInZhbHVlIjoiNWZOTmVHVHpOZzhNd2N5a2dDZWRnRmJpVDhDVHBtbEt0K28yTXhKR2pGbGoyY0hvWWFwR1FrVGsvUUR0dFU2bEJ0a2VhMFRVc1J6ekhrUVYwWUU0NEp3b2g1dzB2eVdrNTVQQm9GSFZNU09rbnhsWkZiaWMwbmVpTXJCWk1WbFYiLCJtYWMiOiJmOGM4ZTg4ZmIyZjc0MjYzNWM3NjY5ZDgwMjg1ODU2ZjRhOTExN2NmMTc1OGIyYTU4Mjg4MTJmMWU0ZDA5OTI4IiwidGFnIjoiIn0%3D; expires=Fri, 27 Mar 2026 01:05:12 GMT; Max-Age=7200; path=/; domain=tracklabsolar.com; secure; samesite=lax; tracklab_session=eyJpdiI6IkZlLzBLZ3NiYjJoaDNHL01JNVQ1Tnc9PSIsInZhbHVlIjoiUk1lRW9uY2QrUm5xWlA3RVpFMlZ3Y2NUQ2tnZ2MvNHhaQXdpTjgrVTZvM3htazNZVFAzVHdheW5kUGU1OTg2TURRNlBFb0NraC9MTE1odmUrNWU4VEFHWENkU2hielBacXFGSjhacDhGb0dBRnlxLzZGZ2tBNEhlN29sMGNIWUQiLCJtYWMiOiIxNWJjYTUxZGE4NjNhZjUxODg1NTFmNzM2OGY5NDQ1MzUxNDBlYzI1ZGQxMzhhMjg2OTBmNDk1NDcwMTk3MzZhIiwidGFnIjoiIn0%3D; expires=Fri, 27 Mar 2026 01:05:12 GMT; Max-Age=7200; path=/; domain=tracklabsolar.com; secure; httponly; samesite=lax
 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="refresh" content="0;url='https://tracklabsolar.com/emailVerification?error=invalid&amp;msg=Invalid+verification+link'" />

        <title>Redirecting to https://tracklabsolar.com/emailVerification?error=invalid&amp;msg=Invalid+verification+link</title>
    </head>
    <body>
        Redirecting to <a href="https://tracklabsolar.com/emailVerification?error=invalid&amp;msg=Invalid+verification+link">https://tracklabsolar.com/emailVerification?error=invalid&amp;msg=Invalid+verification+link</a>.
    </body>
</html>
 

Request      

GET api/v1/verify-email/{id}/{hash}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   string   

The ID of the verify email. Example: quas

hash   string   

Example: dolor

Invitations

Get invitation details by token.

requires authentication

Public endpoint - no authentication required. Returns invitation details for display before acceptance.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/invitations/tempore" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/invitations/tempore"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/invitations/tempore',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/invitations/tempore'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "email": "user@example.com",
        "companyName": "Example Company",
        "roleName": "user",
        "invitedBy": "John Doe",
        "status": "pending",
        "validUntil": "2026-01-27T12:00:00Z",
        "isExpired": false
    }
}
 

Request      

GET api/v1/invitations/{token}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

token   string   

Example: tempore

Accept an invitation.

requires authentication

Requires authentication. Adds the authenticated user to the company with the pre-assigned role from the invitation.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/invitations/deserunt/accept" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/invitations/deserunt/accept"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/invitations/deserunt/accept',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/invitations/deserunt/accept'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "uuid": null,
        "email": null,
        "status": null,
        "roleSlug": null,
        "invitedBy": {
            "uuid": null,
            "name": null
        },
        "validUntil": "2026-03-26T23:05:11+00:00",
        "acceptedAt": null,
        "createdAt": "2026-03-26T23:05:11+00:00"
    }
}
 

Request      

POST api/v1/invitations/{token}/accept

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

token   string   

Example: deserunt

Super Admin - Activity Logs

List all activity logs (global scope).

requires authentication

Returns paginated activity logs with optional filtering by event type, action, date range, causer, and other parameters.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/activity-logs?page=1&perPage=25&event=sa.device-model-type&action=create&logName=default&subjectType=User&causerUuid=550e8400-e29b-41d4-a716-446655440000&companySlug=acme-corp&impersonatorUuid=550e8400-e29b-41d4-a716-446655440000&fromDate=2026-01-01&toDate=2026-12-31&batchUuid=550e8400-e29b-41d4-a716-446655440000&search=firmware&sortBy=created_at&sortOrder=desc" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/activity-logs"
);

const params = {
    "page": "1",
    "perPage": "25",
    "event": "sa.device-model-type",
    "action": "create",
    "logName": "default",
    "subjectType": "User",
    "causerUuid": "550e8400-e29b-41d4-a716-446655440000",
    "companySlug": "acme-corp",
    "impersonatorUuid": "550e8400-e29b-41d4-a716-446655440000",
    "fromDate": "2026-01-01",
    "toDate": "2026-12-31",
    "batchUuid": "550e8400-e29b-41d4-a716-446655440000",
    "search": "firmware",
    "sortBy": "created_at",
    "sortOrder": "desc",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/activity-logs',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '25',
            'event' => 'sa.device-model-type',
            'action' => 'create',
            'logName' => 'default',
            'subjectType' => 'User',
            'causerUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'companySlug' => 'acme-corp',
            'impersonatorUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'fromDate' => '2026-01-01',
            'toDate' => '2026-12-31',
            'batchUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'search' => 'firmware',
            'sortBy' => 'created_at',
            'sortOrder' => 'desc',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/activity-logs'
params = {
  'page': '1',
  'perPage': '25',
  'event': 'sa.device-model-type',
  'action': 'create',
  'logName': 'default',
  'subjectType': 'User',
  'causerUuid': '550e8400-e29b-41d4-a716-446655440000',
  'companySlug': 'acme-corp',
  'impersonatorUuid': '550e8400-e29b-41d4-a716-446655440000',
  'fromDate': '2026-01-01',
  'toDate': '2026-12-31',
  'batchUuid': '550e8400-e29b-41d4-a716-446655440000',
  'search': 'firmware',
  'sortBy': 'created_at',
  'sortOrder': 'desc',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/activity-logs

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 25

event   string  optional  

Filter by event category (e.g., "sa.device-model-type"). Must not be greater than 255 characters. Example: sa.device-model-type

action   string  optional  

Filter by action type (e.g., "create", "update", "delete"). Must not be greater than 255 characters. Example: create

logName   string  optional  

Filter by log channel name. Must not be greater than 255 characters. Example: default

subjectType   string  optional  

Filter by affected model type (short name, e.g., "User", "Farm"). Must not be greater than 255 characters. Example: User

causerUuid   string  optional  

Filter by the UUID of the user who performed the action. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

companySlug   string  optional  

Filter by the company slug affected by the activity. The slug of an existing record in the companies table. Example: acme-corp

impersonatorUuid   string  optional  

Filter by the UUID of the admin who was impersonating during the action. Must be a valid UUID. The uuid of an existing record in the users table. Example: 550e8400-e29b-41d4-a716-446655440000

fromDate   string  optional  

Filter activities from this date (ISO 8601 format). Must be a valid date. Example: 2026-01-01

toDate   string  optional  

Filter activities up to this date (ISO 8601 format). Must be a valid date. Must be a date after or equal to fromDate. Example: 2026-12-31

batchUuid   string  optional  

Filter by batch UUID to get related activities. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

search   string  optional  

Search in properties, description, and event fields. Must not be greater than 255 characters. Example: firmware

sortBy   string  optional  

Field to sort by (created_at, event, description, log_name). Example: created_at

sortOrder   string  optional  

Sort direction (asc, desc). Example: desc

Get available filter options for activity logs.

requires authentication

Returns distinct values for events, log names, and subject types to populate filter dropdowns in the UI.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/activity-logs/filter-options?page=1&perPage=25&event=sa.device-model-type&action=create&logName=default&subjectType=User&causerUuid=550e8400-e29b-41d4-a716-446655440000&companySlug=acme-corp&impersonatorUuid=550e8400-e29b-41d4-a716-446655440000&fromDate=2026-01-01&toDate=2026-12-31&batchUuid=550e8400-e29b-41d4-a716-446655440000&search=firmware&sortBy=created_at&sortOrder=desc" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/activity-logs/filter-options"
);

const params = {
    "page": "1",
    "perPage": "25",
    "event": "sa.device-model-type",
    "action": "create",
    "logName": "default",
    "subjectType": "User",
    "causerUuid": "550e8400-e29b-41d4-a716-446655440000",
    "companySlug": "acme-corp",
    "impersonatorUuid": "550e8400-e29b-41d4-a716-446655440000",
    "fromDate": "2026-01-01",
    "toDate": "2026-12-31",
    "batchUuid": "550e8400-e29b-41d4-a716-446655440000",
    "search": "firmware",
    "sortBy": "created_at",
    "sortOrder": "desc",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/activity-logs/filter-options',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '25',
            'event' => 'sa.device-model-type',
            'action' => 'create',
            'logName' => 'default',
            'subjectType' => 'User',
            'causerUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'companySlug' => 'acme-corp',
            'impersonatorUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'fromDate' => '2026-01-01',
            'toDate' => '2026-12-31',
            'batchUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'search' => 'firmware',
            'sortBy' => 'created_at',
            'sortOrder' => 'desc',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/activity-logs/filter-options'
params = {
  'page': '1',
  'perPage': '25',
  'event': 'sa.device-model-type',
  'action': 'create',
  'logName': 'default',
  'subjectType': 'User',
  'causerUuid': '550e8400-e29b-41d4-a716-446655440000',
  'companySlug': 'acme-corp',
  'impersonatorUuid': '550e8400-e29b-41d4-a716-446655440000',
  'fromDate': '2026-01-01',
  'toDate': '2026-12-31',
  'batchUuid': '550e8400-e29b-41d4-a716-446655440000',
  'search': 'firmware',
  'sortBy': 'created_at',
  'sortOrder': 'desc',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/activity-logs/filter-options

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 25

event   string  optional  

Filter by event category (e.g., "sa.device-model-type"). Must not be greater than 255 characters. Example: sa.device-model-type

action   string  optional  

Filter by action type (e.g., "create", "update", "delete"). Must not be greater than 255 characters. Example: create

logName   string  optional  

Filter by log channel name. Must not be greater than 255 characters. Example: default

subjectType   string  optional  

Filter by affected model type (short name, e.g., "User", "Farm"). Must not be greater than 255 characters. Example: User

causerUuid   string  optional  

Filter by the UUID of the user who performed the action. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

companySlug   string  optional  

Filter by the company slug affected by the activity. The slug of an existing record in the companies table. Example: acme-corp

impersonatorUuid   string  optional  

Filter by the UUID of the admin who was impersonating during the action. Must be a valid UUID. The uuid of an existing record in the users table. Example: 550e8400-e29b-41d4-a716-446655440000

fromDate   string  optional  

Filter activities from this date (ISO 8601 format). Must be a valid date. Example: 2026-01-01

toDate   string  optional  

Filter activities up to this date (ISO 8601 format). Must be a valid date. Must be a date after or equal to fromDate. Example: 2026-12-31

batchUuid   string  optional  

Filter by batch UUID to get related activities. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

search   string  optional  

Search in properties, description, and event fields. Must not be greater than 255 characters. Example: firmware

sortBy   string  optional  

Field to sort by (created_at, event, description, log_name). Example: created_at

sortOrder   string  optional  

Sort direction (asc, desc). Example: desc

Export activity logs.

requires authentication

Exports activity logs with optional filtering. Supports CSV and JSON formats. Uses streaming for memory-efficient export of large datasets.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/activity-logs/export?startDate=2026-01-01&endDate=2026-12-31&event=sa.device-model-type&action=create&logName=default&subjectType=User&causerUuid=550e8400-e29b-41d4-a716-446655440000&batchUuid=550e8400-e29b-41d4-a716-446655440000&search=firmware&format=csv" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/activity-logs/export"
);

const params = {
    "startDate": "2026-01-01",
    "endDate": "2026-12-31",
    "event": "sa.device-model-type",
    "action": "create",
    "logName": "default",
    "subjectType": "User",
    "causerUuid": "550e8400-e29b-41d4-a716-446655440000",
    "batchUuid": "550e8400-e29b-41d4-a716-446655440000",
    "search": "firmware",
    "format": "csv",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/activity-logs/export',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'startDate' => '2026-01-01',
            'endDate' => '2026-12-31',
            'event' => 'sa.device-model-type',
            'action' => 'create',
            'logName' => 'default',
            'subjectType' => 'User',
            'causerUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'batchUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'search' => 'firmware',
            'format' => 'csv',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/activity-logs/export'
params = {
  'startDate': '2026-01-01',
  'endDate': '2026-12-31',
  'event': 'sa.device-model-type',
  'action': 'create',
  'logName': 'default',
  'subjectType': 'User',
  'causerUuid': '550e8400-e29b-41d4-a716-446655440000',
  'batchUuid': '550e8400-e29b-41d4-a716-446655440000',
  'search': 'firmware',
  'format': 'csv',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/activity-logs/export

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

startDate   string  optional  

Filter activities from this date (ISO 8601 format). Must be a valid date. Example: 2026-01-01

endDate   string  optional  

Filter activities up to this date (ISO 8601 format). Must be a valid date. Must be a date after or equal to startDate. Example: 2026-12-31

event   string  optional  

Filter by event category (e.g., "sa.device-model-type"). Must not be greater than 255 characters. Example: sa.device-model-type

action   string  optional  

Filter by action type (e.g., "create", "update", "delete"). Must not be greater than 255 characters. Example: create

logName   string  optional  

Filter by log channel name. Must not be greater than 255 characters. Example: default

subjectType   string  optional  

Filter by affected model type (short name, e.g., "User", "Farm"). Must not be greater than 255 characters. Example: User

causerUuid   string  optional  

Filter by the UUID of the user who performed the action. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

batchUuid   string  optional  

Filter by batch UUID to get related activities. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

search   string  optional  

Search in properties, description, and event fields. Must not be greater than 255 characters. Example: firmware

format   string  optional  

Export format: csv or json (default: json). Example: csv

Super Admin - Company Users

Create a new user for the specified company.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/users" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"new.user@example.com\",
    \"firstName\": \"John\",
    \"lastName\": \"Doe\",
    \"countryIsoCode\": \"US\",
    \"phoneNumber\": \"+1234567890\",
    \"role\": \"admin\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/users"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "new.user@example.com",
    "firstName": "John",
    "lastName": "Doe",
    "countryIsoCode": "US",
    "phoneNumber": "+1234567890",
    "role": "admin"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/users',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'new.user@example.com',
            'firstName' => 'John',
            'lastName' => 'Doe',
            'countryIsoCode' => 'US',
            'phoneNumber' => '+1234567890',
            'role' => 'admin',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/users'
payload = {
    "email": "new.user@example.com",
    "firstName": "John",
    "lastName": "Doe",
    "countryIsoCode": "US",
    "phoneNumber": "+1234567890",
    "role": "admin"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/users

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

email   string   

The user's email address. Must be a valid email address. Must not be greater than 100 characters. Example: new.user@example.com

firstName   string   

The user's first name. Must be at least 2 characters. Must not be greater than 100 characters. Example: John

lastName   string  optional  

The user's last name. Must be at least 2 characters. Must not be greater than 100 characters. Example: Doe

countryIsoCode   string   

The ISO code of the user's country. The iso_code of an existing record in the countries table. Example: US

phoneNumber   string   

The user's phone number. Must be at least 6 characters. Example: +1234567890

role   string  optional  

User role (owner, admin, or user). Defaults to user if not provided. Example: admin

Remove a user from a specific company.

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}/users/{user_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

Super Admin - Data Retention

List all data retention audit records.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/data-retention/audits?page=1&perPage=25&status=completed&dataType=device-messages&operation=delete&startedAfter=2026-01-01&startedBefore=2026-12-31&sortBy=started_at&sortOrder=desc" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/data-retention/audits"
);

const params = {
    "page": "1",
    "perPage": "25",
    "status": "completed",
    "dataType": "device-messages",
    "operation": "delete",
    "startedAfter": "2026-01-01",
    "startedBefore": "2026-12-31",
    "sortBy": "started_at",
    "sortOrder": "desc",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/data-retention/audits',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '25',
            'status' => 'completed',
            'dataType' => 'device-messages',
            'operation' => 'delete',
            'startedAfter' => '2026-01-01',
            'startedBefore' => '2026-12-31',
            'sortBy' => 'started_at',
            'sortOrder' => 'desc',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/data-retention/audits'
params = {
  'page': '1',
  'perPage': '25',
  'status': 'completed',
  'dataType': 'device-messages',
  'operation': 'delete',
  'startedAfter': '2026-01-01',
  'startedBefore': '2026-12-31',
  'sortBy': 'started_at',
  'sortOrder': 'desc',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/data-retention/audits

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 25

status   string  optional  

Filter by audit status (e.g., "pending", "completed", "failed"). Example: completed

dataType   string  optional  

Filter by data type (e.g., "device-messages"). Example: device-messages

operation   string  optional  

Filter by operation type (e.g., "delete", "archive"). Example: delete

startedAfter   string  optional  

Filter audits started after this date (ISO 8601 format). Must be a valid date. Example: 2026-01-01

startedBefore   string  optional  

Filter audits started before this date (ISO 8601 format). Must be a valid date. Example: 2026-12-31

sortBy   string  optional  

Field to sort by (started_at, completed_at, created_at, data_type, operation, status, record_count). Example: started_at

sortOrder   string  optional  

Sort direction (asc, desc). Example: desc

Show a single data retention audit record.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/data-retention/audits/cc58b8da-c994-4cf2-a6d7-e7267b267ca2" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/data-retention/audits/cc58b8da-c994-4cf2-a6d7-e7267b267ca2"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/data-retention/audits/cc58b8da-c994-4cf2-a6d7-e7267b267ca2',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/data-retention/audits/cc58b8da-c994-4cf2-a6d7-e7267b267ca2'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/data-retention/audits/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: cc58b8da-c994-4cf2-a6d7-e7267b267ca2

List global default retention policies.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/data-retention/defaults" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/data-retention/defaults"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/data-retention/defaults',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/data-retention/defaults'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/data-retention/defaults

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

List effective retention policies for a company.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/data-retention/companies/{company_slug}/policies

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Create or update a company retention policy override.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"dataType\": \"measurement\",
    \"retentionDays\": 365,
    \"archiveEnabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "dataType": "measurement",
    "retentionDays": 365,
    "archiveEnabled": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'dataType' => 'measurement',
            'retentionDays' => 365,
            'archiveEnabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies'
payload = {
    "dataType": "measurement",
    "retentionDays": 365,
    "archiveEnabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/data-retention/companies/{company_slug}/policies

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

dataType   string   

Data retention type slug. Example: measurement

retentionDays   integer   

Retention period in days. Must be at least 1. Must not be greater than 3650. Example: 365

archiveEnabled   boolean  optional  

Whether expired records should be archived before deletion. Example: true

Update a company retention policy override for a specific data type.

requires authentication

Example request:
curl --request PUT \
    "https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies/collector-measurements" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"retentionDays\": 730,
    \"archiveEnabled\": false
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies/collector-measurements"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "retentionDays": 730,
    "archiveEnabled": false
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    'https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies/collector-measurements',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'retentionDays' => 730,
            'archiveEnabled' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies/collector-measurements'
payload = {
    "retentionDays": 730,
    "archiveEnabled": false
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Request      

PUT api/v1/sa/data-retention/companies/{company_slug}/policies/{dataRetentionDataType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

dataRetentionDataType_slug   string   

The slug of the dataRetentionDataType. Example: collector-measurements

Body Parameters

retentionDays   integer   

Updated retention period in days. Must be at least 1. Must not be greater than 3650. Example: 730

archiveEnabled   boolean  optional  

Whether archiving is enabled before deleting expired records. Example: false

Delete a company retention policy override, reverting to global default.

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies/collector-measurements" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies/collector-measurements"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies/collector-measurements',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/data-retention/companies/tracklab/policies/collector-measurements'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/data-retention/companies/{company_slug}/policies/{dataRetentionDataType_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

dataRetentionDataType_slug   string   

The slug of the dataRetentionDataType. Example: collector-measurements

Super Admin - Impersonation

Stop the current impersonation session.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/impersonation/stop" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/impersonation/stop"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/impersonation/stop',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/impersonation/stop'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/sa/impersonation/stop

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get current impersonation status.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/impersonation/status" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/impersonation/status"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/impersonation/status',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/impersonation/status'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/impersonation/status

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Start an impersonation session.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/impersonation/start" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/impersonation/start"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/impersonation/start',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/impersonation/start'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/sa/impersonation/start

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

List active impersonation sessions.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/impersonation/sessions?page=1&perPage=25&impersonatorUuid=550e8400-e29b-41d4-a716-446655440000&targetUserUuid=550e8400-e29b-41d4-a716-446655440000&active=1&fromDate=2026-01-01&toDate=2026-12-31&sortBy=startedAt&sortOrder=desc" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/impersonation/sessions"
);

const params = {
    "page": "1",
    "perPage": "25",
    "impersonatorUuid": "550e8400-e29b-41d4-a716-446655440000",
    "targetUserUuid": "550e8400-e29b-41d4-a716-446655440000",
    "active": "1",
    "fromDate": "2026-01-01",
    "toDate": "2026-12-31",
    "sortBy": "startedAt",
    "sortOrder": "desc",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/impersonation/sessions',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '25',
            'impersonatorUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'targetUserUuid' => '550e8400-e29b-41d4-a716-446655440000',
            'active' => '1',
            'fromDate' => '2026-01-01',
            'toDate' => '2026-12-31',
            'sortBy' => 'startedAt',
            'sortOrder' => 'desc',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/impersonation/sessions'
params = {
  'page': '1',
  'perPage': '25',
  'impersonatorUuid': '550e8400-e29b-41d4-a716-446655440000',
  'targetUserUuid': '550e8400-e29b-41d4-a716-446655440000',
  'active': '1',
  'fromDate': '2026-01-01',
  'toDate': '2026-12-31',
  'sortBy': 'startedAt',
  'sortOrder': 'desc',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/impersonation/sessions

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination (minimum: 1). Must be at least 1. Example: 1

perPage   integer  optional  

Number of items per page (1-100). Must be at least 1. Must not be greater than 100. Example: 25

impersonatorUuid   string  optional  

Filter by impersonator user UUID. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

targetUserUuid   string  optional  

Filter by target user UUID. Must be a valid UUID. Example: 550e8400-e29b-41d4-a716-446655440000

active   boolean  optional  

Filter by active sessions (default true). Example: true

fromDate   string  optional  

Filter sessions starting on/after this date (ISO 8601). Must be a valid date. Example: 2026-01-01

toDate   string  optional  

Filter sessions starting on/before this date (ISO 8601). Must be a valid date. Must be a date after or equal to fromDate. Example: 2026-12-31

sortBy   string  optional  

Sort field (startedAt, expiresAt, createdAt). Example: startedAt

sortOrder   string  optional  

Sort direction (asc, desc). Example: desc

Terminate an impersonation session (admin override).

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/impersonation/sessions/5eee9f6f-18ce-35ad-a991-6d2824df0fd3/terminate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/impersonation/sessions/5eee9f6f-18ce-35ad-a991-6d2824df0fd3/terminate"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/impersonation/sessions/5eee9f6f-18ce-35ad-a991-6d2824df0fd3/terminate',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/impersonation/sessions/5eee9f6f-18ce-35ad-a991-6d2824df0fd3/terminate'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/sa/impersonation/sessions/{session_uuid}/terminate

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

session_uuid   string   

Example: 5eee9f6f-18ce-35ad-a991-6d2824df0fd3

Super Admin - TrackLab Users

Elevate a TrackLab user to super admin status.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/elevate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/elevate"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/elevate',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/elevate'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/sa/tracklab/users/{user_uuid}/elevate

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

Revoke super admin status from a TrackLab user.

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/revoke" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/revoke"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/revoke',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/tracklab/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/revoke'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request      

POST api/v1/sa/tracklab/users/{user_uuid}/revoke

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

Super Admin - Users

GET api/v1/sa/users

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/users" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"search\": \"tim\",
    \"companySlug\": \"tracklab-solar\",
    \"role\": \"admin\",
    \"isActive\": true,
    \"page\": 1,
    \"perPage\": 25
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/users"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "search": "tim",
    "companySlug": "tracklab-solar",
    "role": "admin",
    "isActive": true,
    "page": 1,
    "perPage": 25
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/users',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'search' => 'tim',
            'companySlug' => 'tracklab-solar',
            'role' => 'admin',
            'isActive' => true,
            'page' => 1,
            'perPage' => 25,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/users'
payload = {
    "search": "tim",
    "companySlug": "tracklab-solar",
    "role": "admin",
    "isActive": true,
    "page": 1,
    "perPage": 25
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": [
        {
            "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
            "createdAt": "2025-11-12T20:27:08+00:00",
            "updatedAt": "2026-02-10T15:20:26+00:00",
            "defaultCompanySlug": null,
            "emailVerifiedAt": null,
            "defaultCountryIsoCode": "",
            "defaultCountryEmoji": "",
            "email": "liquid.ideas@gmail.com",
            "firstName": "Jo",
            "lastName": "Whitehouse",
            "phoneNumbers": [],
            "roles": [],
            "imgUrl": null,
            "imgThumbUrl": null,
            "imgLargeUrl": null,
            "imgUrlExpiresAt": null,
            "isActive": true,
            "disabledAt": null,
            "status": null,
            "statusName": null
        },
        {
            "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
            "createdAt": "2025-11-12T20:27:08+00:00",
            "updatedAt": "2026-02-10T15:20:26+00:00",
            "defaultCompanySlug": null,
            "emailVerifiedAt": null,
            "defaultCountryIsoCode": "",
            "defaultCountryEmoji": "",
            "email": "liquid.ideas@gmail.com",
            "firstName": "Jo",
            "lastName": "Whitehouse",
            "phoneNumbers": [],
            "roles": [],
            "imgUrl": null,
            "imgThumbUrl": null,
            "imgLargeUrl": null,
            "imgUrlExpiresAt": null,
            "isActive": true,
            "disabledAt": null,
            "status": null,
            "statusName": null
        }
    ]
}
 

Request      

GET api/v1/sa/users

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

search   string  optional  

Optional search term for name or email. Must not be greater than 255 characters. Example: tim

companySlug   string  optional  

Optional company slug to scope results. The slug of an existing record in the companies table. Example: tracklab-solar

role   string  optional  

Optional role filter. Example: admin

isActive   string  optional  

Optional active filter (0/1/true/false). Example: true

page   integer  optional  

Pagination page number. Must be at least 1. Example: 1

perPage   integer  optional  

Pagination size. Must be at least 1. Must not be greater than 100. Example: 25

GET api/v1/sa/users/{uuid}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
        "createdAt": "2025-11-12T20:27:08+00:00",
        "updatedAt": "2026-02-10T15:20:26+00:00",
        "defaultCompanySlug": null,
        "emailVerifiedAt": null,
        "defaultCountryIsoCode": "",
        "defaultCountryEmoji": "",
        "email": "liquid.ideas@gmail.com",
        "firstName": "Jo",
        "lastName": "Whitehouse",
        "phoneNumbers": [],
        "roles": [],
        "imgUrl": null,
        "imgThumbUrl": null,
        "imgLargeUrl": null,
        "imgUrlExpiresAt": null,
        "isActive": true,
        "disabledAt": null,
        "status": null,
        "statusName": null
    }
}
 

Request      

GET api/v1/sa/users/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

GET api/v1/sa/users/{user_uuid}/role

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/role" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/role"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/role',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/role'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/users/{user_uuid}/role

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

GET api/v1/sa/users/{user_uuid}/permissions

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/permissions" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/permissions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/permissions',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/permissions'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/users/{user_uuid}/permissions

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

PATCH api/v1/sa/users/{uuid}

requires authentication

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"updated.user@example.com\",
    \"firstName\": \"Tim\",
    \"lastName\": \"Haak\",
    \"countryIsoCode\": \"NL\",
    \"phoneNumber\": \"+31612345678\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "updated.user@example.com",
    "firstName": "Tim",
    "lastName": "Haak",
    "countryIsoCode": "NL",
    "phoneNumber": "+31612345678"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'updated.user@example.com',
            'firstName' => 'Tim',
            'lastName' => 'Haak',
            'countryIsoCode' => 'NL',
            'phoneNumber' => '+31612345678',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd'
payload = {
    "email": "updated.user@example.com",
    "firstName": "Tim",
    "lastName": "Haak",
    "countryIsoCode": "NL",
    "phoneNumber": "+31612345678"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
        "createdAt": "2025-11-12T20:27:08+00:00",
        "updatedAt": "2026-02-10T15:20:26+00:00",
        "defaultCompanySlug": null,
        "emailVerifiedAt": null,
        "defaultCountryIsoCode": "",
        "defaultCountryEmoji": "",
        "email": "liquid.ideas@gmail.com",
        "firstName": "Jo",
        "lastName": "Whitehouse",
        "phoneNumbers": [],
        "roles": [],
        "imgUrl": null,
        "imgThumbUrl": null,
        "imgLargeUrl": null,
        "imgUrlExpiresAt": null,
        "isActive": true,
        "disabledAt": null,
        "status": null,
        "statusName": null
    }
}
 

Request      

PATCH api/v1/sa/users/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

Body Parameters

email   string  optional  

Updated user email address. Must be a valid email address. Must not be greater than 100 characters. Example: updated.user@example.com

firstName   string  optional  

Updated first name. Must be at least 2 characters. Must not be greater than 100 characters. Example: Tim

lastName   string  optional  

Updated last name. Must be at least 2 characters. Must not be greater than 100 characters. Example: Haak

countryIsoCode   string  optional  

ISO country code. The iso_code of an existing record in the countries table. Example: NL

phoneNumber   string  optional  

Updated phone number. Must be at least 6 characters. Example: +31612345678

DELETE api/v1/sa/users/{uuid}

requires authentication

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/users/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

POST api/v1/sa/users/{user_uuid}/profile/picture

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"file\": \"perferendis\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "file": "perferendis"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'file' => 'perferendis',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture'
payload = {
    "file": "perferendis"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "uuid": "b11fab33-a56a-4a78-a3c1-b9d324c6aacd",
        "createdAt": "2025-11-12T20:27:08+00:00",
        "updatedAt": "2026-02-10T15:20:26+00:00",
        "defaultCompanySlug": null,
        "emailVerifiedAt": null,
        "defaultCountryIsoCode": "",
        "defaultCountryEmoji": "",
        "email": "liquid.ideas@gmail.com",
        "firstName": "Jo",
        "lastName": "Whitehouse",
        "phoneNumbers": [],
        "roles": [],
        "imgUrl": null,
        "imgThumbUrl": null,
        "imgLargeUrl": null,
        "imgUrlExpiresAt": null,
        "isActive": true,
        "disabledAt": null,
        "status": null,
        "statusName": null
    }
}
 

Request      

POST api/v1/sa/users/{user_uuid}/profile/picture

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

Body Parameters

file   string   

Example: perferendis

GET api/v1/sa/users/{user_uuid}/profile/picture/{format?}

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture/architecto',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/users/b11fab33-a56a-4a78-a3c1-b9d324c6aacd/profile/picture/architecto'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/users/{user_uuid}/profile/picture/{format?}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

user_uuid   string   

Example: b11fab33-a56a-4a78-a3c1-b9d324c6aacd

format   string  optional  

Example: architecto

Super Admin > Companies

List all companies

requires authentication

Returns a paginated list of all companies with optional filtering.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"search\": \"Solar\",
    \"enabled\": true,
    \"perPage\": 25,
    \"page\": 1
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "search": "Solar",
    "enabled": true,
    "perPage": 25,
    "page": 1
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'search' => 'Solar',
            'enabled' => true,
            'perPage' => 25,
            'page' => 1,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c'
payload = {
    "search": "Solar",
    "enabled": true,
    "perPage": 25,
    "page": 1
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

search   string  optional  

Search term for filtering companies. Must not be greater than 100 characters. Example: Solar

enabled   boolean  optional  

Filter by enabled status. Example: true

perPage   integer  optional  

Number of records per page (1-100). Must be at least 1. Must not be greater than 100. Example: 25

page   integer  optional  

Page number for pagination. Must be at least 1. Example: 1

Create a new company

requires authentication

Creates a new company with the provided details.

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Solar Energy Corp\",
    \"slug\": \"solar-energy-corp\",
    \"countryIsoCode\": \"US\"
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Solar Energy Corp",
    "slug": "solar-energy-corp",
    "countryIsoCode": "US"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Solar Energy Corp',
            'slug' => 'solar-energy-corp',
            'countryIsoCode' => 'US',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c'
payload = {
    "name": "Solar Energy Corp",
    "slug": "solar-energy-corp",
    "countryIsoCode": "US"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

name   string   

Company name. Must be at least 2 characters. Must not be greater than 255 characters. Example: Solar Energy Corp

slug   string  optional  

URL-friendly identifier (lowercase letters, numbers, and hyphens). Must match the regex /^[a-z0-9-]+$/. Must be at least 2 characters. Must not be greater than 100 characters. Example: solar-energy-corp

countryIsoCode   string   

ISO country code. The iso_code of an existing record in the countries table. Example: US

Get a company

requires authentication

Returns the details of a specific company.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"search\": \"Solar\",
    \"enabled\": true,
    \"perPage\": 25,
    \"page\": 1
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "search": "Solar",
    "enabled": true,
    "perPage": 25,
    "page": 1
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'search' => 'Solar',
            'enabled' => true,
            'perPage' => 25,
            'page' => 1,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab'
payload = {
    "search": "Solar",
    "enabled": true,
    "perPage": 25,
    "page": 1
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

search   string  optional  

Search term for filtering companies. Must not be greater than 100 characters. Example: Solar

enabled   boolean  optional  

Filter by enabled status. Example: true

perPage   integer  optional  

Number of records per page (1-100). Must be at least 1. Must not be greater than 100. Example: 25

page   integer  optional  

Page number for pagination. Must be at least 1. Example: 1

Update a company

requires authentication

Updates the specified company with the provided details.

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Solar Energy Corp Updated\",
    \"slug\": \"solar-energy-corp-updated\",
    \"countryIsoCode\": \"US\",
    \"enabled\": true
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Solar Energy Corp Updated",
    "slug": "solar-energy-corp-updated",
    "countryIsoCode": "US",
    "enabled": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Solar Energy Corp Updated',
            'slug' => 'solar-energy-corp-updated',
            'countryIsoCode' => 'US',
            'enabled' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab'
payload = {
    "name": "Solar Energy Corp Updated",
    "slug": "solar-energy-corp-updated",
    "countryIsoCode": "US",
    "enabled": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Request      

PATCH api/v1/sa/c/{company_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

name   string  optional  

Company name. Must be at least 2 characters. Must not be greater than 255 characters. Example: Solar Energy Corp Updated

slug   string  optional  

URL-friendly identifier (lowercase letters, numbers, and hyphens). Must match the regex /^[a-z0-9-]+$/. Must be at least 2 characters. Must not be greater than 100 characters. Example: solar-energy-corp-updated

countryIsoCode   string  optional  

ISO country code. The iso_code of an existing record in the countries table. Example: US

enabled   boolean  optional  

Whether the company is enabled. Example: true

Disable a company

requires authentication

Disables the specified company. Users of this company will not be able to log in.

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/disable" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/disable"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PATCH",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/disable',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/disable'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers)
response.json()

Request      

PATCH api/v1/sa/c/{company_slug}/disable

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Enable a company

requires authentication

Enables the specified company. Users of this company will be able to log in again.

Example request:
curl --request PATCH \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/enable" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/enable"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PATCH",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/enable',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/enable'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers)
response.json()

Request      

PATCH api/v1/sa/c/{company_slug}/enable

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Delete a company

requires authentication

Soft deletes the specified company.

Example request:
curl --request DELETE \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request      

DELETE api/v1/sa/c/{company_slug}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

POST api/v1/sa/c/{company_slug}/address

requires authentication

Example request:
curl --request POST \
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/address" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"addressString\": \"123 Main St, London SW1A 1AA\",
    \"addressLine1\": \"123 Main Street\",
    \"city\": \"London\",
    \"postCode\": \"SW1A 1AA\",
    \"countryIsoCode\": \"GB\",
    \"addressLine2\": \"Apt 4B\",
    \"neighborhood\": \"Westminster\",
    \"locality\": \"Central London\",
    \"place\": \"Piccadilly Circus\",
    \"district\": \"City of Westminster\",
    \"region\": \"Greater London\",
    \"location\": {
        \"lat\": 51.5074,
        \"long\": -0.1278,
        \"latitude\": 51.5074,
        \"longitude\": -0.1278
    }
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/address"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "addressString": "123 Main St, London SW1A 1AA",
    "addressLine1": "123 Main Street",
    "city": "London",
    "postCode": "SW1A 1AA",
    "countryIsoCode": "GB",
    "addressLine2": "Apt 4B",
    "neighborhood": "Westminster",
    "locality": "Central London",
    "place": "Piccadilly Circus",
    "district": "City of Westminster",
    "region": "Greater London",
    "location": {
        "lat": 51.5074,
        "long": -0.1278,
        "latitude": 51.5074,
        "longitude": -0.1278
    }
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/address',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'addressString' => '123 Main St, London SW1A 1AA',
            'addressLine1' => '123 Main Street',
            'city' => 'London',
            'postCode' => 'SW1A 1AA',
            'countryIsoCode' => 'GB',
            'addressLine2' => 'Apt 4B',
            'neighborhood' => 'Westminster',
            'locality' => 'Central London',
            'place' => 'Piccadilly Circus',
            'district' => 'City of Westminster',
            'region' => 'Greater London',
            'location' => [
                'lat' => 51.5074,
                'long' => -0.1278,
                'latitude' => 51.5074,
                'longitude' => -0.1278,
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/address'
payload = {
    "addressString": "123 Main St, London SW1A 1AA",
    "addressLine1": "123 Main Street",
    "city": "London",
    "postCode": "SW1A 1AA",
    "countryIsoCode": "GB",
    "addressLine2": "Apt 4B",
    "neighborhood": "Westminster",
    "locality": "Central London",
    "place": "Piccadilly Circus",
    "district": "City of Westminster",
    "region": "Greater London",
    "location": {
        "lat": 51.5074,
        "long": -0.1278,
        "latitude": 51.5074,
        "longitude": -0.1278
    }
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request      

POST api/v1/sa/c/{company_slug}/address

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

Body Parameters

addressString   string  optional  

Full address as a single string. If provided, individual address fields are not required. Must not be greater than 500 characters. Example: 123 Main St, London SW1A 1AA

addressLine1   string   

First line of the address (required if addressString not provided). Must not be greater than 255 characters. Example: 123 Main Street

city   string   

City name (required if addressString not provided). Must not be greater than 255 characters. Example: London

postCode   string   

Postal code (required if addressString not provided). Must not be greater than 20 characters. Example: SW1A 1AA

countryIsoCode   string   

Two-letter ISO country code. The iso_code of an existing record in the countries table. Example: GB

addressLine2   string  optional  

Second line of the address. Must not be greater than 255 characters. Example: Apt 4B

neighborhood   string  optional  

Neighborhood name. Must not be greater than 255 characters. Example: Westminster

locality   string  optional  

Locality name. Must not be greater than 255 characters. Example: Central London

place   string  optional  

Place name. Must not be greater than 255 characters. Example: Piccadilly Circus

district   string  optional  

District name. Must not be greater than 255 characters. Example: City of Westminster

region   string  optional  

Region name. Must not be greater than 255 characters. Example: Greater London

location   object  optional  

Geographic coordinates (supports both latitude/longitude and lat/long formats).

latitude   number  optional  

Latitude coordinate (required if location object is provided). This field is required when location is present. Example: 51.5074

longitude   number  optional  

Longitude coordinate (required if location object is provided). This field is required when location is present. Example: -0.1278

requires authentication

Get a company's logo in the requested format.

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/logo/recusandae" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/logo/recusandae"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/logo/recusandae',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/logo/recusandae'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/c/{company_slug}/logo/{format?}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

format   string  optional  

Example: recusandae

requires authentication

Get a company's logo using a signed URL token.

requires authentication

The token contains encrypted company slug and expiry timestamp. URL format: /sa/c/{companySlug}/logo/{signedToken}/{format}/image.webp

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/c/tracklab/logo/eyJpdiI6.../square-256-webp/image.webp" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/c/tracklab/logo/eyJpdiI6.../square-256-webp/image.webp"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/c/tracklab/logo/eyJpdiI6.../square-256-webp/image.webp',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/c/tracklab/logo/eyJpdiI6.../square-256-webp/image.webp'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


The image file stream
 

Example response (403):


{
    "message": "Invalid or expired token."
}
 

Example response (404):


{
    "message": "Company not found."
}
 

Request      

GET api/v1/sa/c/{company_slug}/logo/{signedToken}/{format}/image.webp

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

company_slug   string   

The slug of the company. Example: tracklab

signedToken   string   

The encrypted signed token. Example: eyJpdiI6...

format   string   

The image format/conversion name. Example: square-256-webp

company   string   

The company slug. Example: demo-gui

Super Admin > Mobile Audit Events

List mobile audit events

requires authentication

Returns a paginated list of all mobile audit events with optional filtering.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/mobile/audit-events?page=1&perPage=25&companySlug=acme-corp&collectorUuid=550e8400-e29b-41d4-a716-446655440010&userUuid=550e8400-e29b-41d4-a716-446655440011&eventName=mobile-ncu&actionName=command-send&dateFrom=2026-03-01T00%3A00%3A00Z&dateTo=2026-03-11T23%3A59%3A59Z" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/mobile/audit-events"
);

const params = {
    "page": "1",
    "perPage": "25",
    "companySlug": "acme-corp",
    "collectorUuid": "550e8400-e29b-41d4-a716-446655440010",
    "userUuid": "550e8400-e29b-41d4-a716-446655440011",
    "eventName": "mobile-ncu",
    "actionName": "command-send",
    "dateFrom": "2026-03-01T00:00:00Z",
    "dateTo": "2026-03-11T23:59:59Z",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/mobile/audit-events',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'perPage' => '25',
            'companySlug' => 'acme-corp',
            'collectorUuid' => '550e8400-e29b-41d4-a716-446655440010',
            'userUuid' => '550e8400-e29b-41d4-a716-446655440011',
            'eventName' => 'mobile-ncu',
            'actionName' => 'command-send',
            'dateFrom' => '2026-03-01T00:00:00Z',
            'dateTo' => '2026-03-11T23:59:59Z',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/mobile/audit-events'
params = {
  'page': '1',
  'perPage': '25',
  'companySlug': 'acme-corp',
  'collectorUuid': '550e8400-e29b-41d4-a716-446655440010',
  'userUuid': '550e8400-e29b-41d4-a716-446655440011',
  'eventName': 'mobile-ncu',
  'actionName': 'command-send',
  'dateFrom': '2026-03-01T00:00:00Z',
  'dateTo': '2026-03-11T23:59:59Z',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/mobile/audit-events

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination. Must be at least 1. Example: 1

perPage   integer  optional  

Number of audit events to return per page (1-100). Must be at least 1. Must not be greater than 100. Example: 25

companySlug   string  optional  

Filter audit events to a single company slug. The slug of an existing record in the companies table. Example: acme-corp

collectorUuid   string  optional  

Filter audit events to a single collector UUID. Must be a valid UUID. The uuid of an existing record in the collectors table. Example: 550e8400-e29b-41d4-a716-446655440010

userUuid   string  optional  

Filter audit events to a single user UUID. Must be a valid UUID. The uuid of an existing record in the users table. Example: 550e8400-e29b-41d4-a716-446655440011

eventName   string  optional  

Filter by mobile audit event type slug. The slug of an existing record in the mobile_audit_event_types table. Example: mobile-ncu

actionName   string  optional  

Filter by mobile audit action type slug. The slug of an existing record in the mobile_audit_action_types table. Example: command-send

dateFrom   string  optional  

Only include audit events that occurred on or after this ISO 8601 timestamp. Must be a valid date. Example: 2026-03-01T00:00:00Z

dateTo   string  optional  

Only include audit events that occurred on or before this ISO 8601 timestamp. Must be a valid date. Must be a date after or equal to dateFrom. Example: 2026-03-11T23:59:59Z

Show a mobile audit event

requires authentication

Returns full detail for a single mobile audit event including context, request, result, operator label, and device info.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/mobile/audit-events/de47c505-d218-3e81-89cb-159c6185fa5e" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/mobile/audit-events/de47c505-d218-3e81-89cb-159c6185fa5e"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/mobile/audit-events/de47c505-d218-3e81-89cb-159c6185fa5e',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/mobile/audit-events/de47c505-d218-3e81-89cb-159c6185fa5e'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/mobile/audit-events/{auditEvent_uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

auditEvent_uuid   string   

Example: de47c505-d218-3e81-89cb-159c6185fa5e

Super Admin > Mobile Devices

List mobile devices

requires authentication

Returns a paginated list of all mobile devices with optional filtering.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/mobile/devices" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/mobile/devices"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/mobile/devices',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/mobile/devices'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/mobile/devices

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Show a mobile device

requires authentication

Returns detailed information for a single mobile device including masked push token and audit event count.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/mobile/devices/91a2dba3-a2bd-4b91-bbe9-fa27c2970489" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/mobile/devices/91a2dba3-a2bd-4b91-bbe9-fa27c2970489"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/mobile/devices/91a2dba3-a2bd-4b91-bbe9-fa27c2970489',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/mobile/devices/91a2dba3-a2bd-4b91-bbe9-fa27c2970489'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/mobile/devices/{uuid}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

uuid   string   

Example: 91a2dba3-a2bd-4b91-bbe9-fa27c2970489

Super Admin > Routes

GET api/v1/sa/admin/routes

requires authentication

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/sa/admin/routes" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"all\": false
}"
const url = new URL(
    "https://tracklabsolar.com/api/v1/sa/admin/routes"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "all": false
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/sa/admin/routes',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'all' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/sa/admin/routes'
payload = {
    "all": false
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sa/admin/routes

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

all   boolean  optional  

Include all registered routes (not just the API prefix). Example: false

System

APIs for system testing and health checks

Test System

Check if the system is working properly. Tests DB + Redis connectivity.

Example request:
curl --request GET \
    --get "https://tracklabsolar.com/api/v1/test/basic_system" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://tracklabsolar.com/api/v1/test/basic_system"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    'https://tracklabsolar.com/api/v1/test/basic_system',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://tracklabsolar.com/api/v1/test/basic_system'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "success": true,
    "data": {
        "systemWorking": true,
        "services": {
            "database": true,
            "redis": true
        },
        "errors": []
    }
}
 

Request      

GET api/v1/test/basic_system

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json