curl --request POST \
--url https://platform.jobbit.uk/v1/projects/{project_id}/invites \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"role": "viewer",
"label": "For the clinic team",
"expires_in_hours": 720,
"max_uses": 5
}
'import requests
url = "https://platform.jobbit.uk/v1/projects/{project_id}/invites"
payload = {
"role": "viewer",
"label": "For the clinic team",
"expires_in_hours": 720,
"max_uses": 5
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
role: 'viewer',
label: 'For the clinic team',
expires_in_hours: 720,
max_uses: 5
})
};
fetch('https://platform.jobbit.uk/v1/projects/{project_id}/invites', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://platform.jobbit.uk/v1/projects/{project_id}/invites",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'role' => 'viewer',
'label' => 'For the clinic team',
'expires_in_hours' => 720,
'max_uses' => 5
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://platform.jobbit.uk/v1/projects/{project_id}/invites"
payload := strings.NewReader("{\n \"role\": \"viewer\",\n \"label\": \"For the clinic team\",\n \"expires_in_hours\": 720,\n \"max_uses\": 5\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://platform.jobbit.uk/v1/projects/{project_id}/invites")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"role\": \"viewer\",\n \"label\": \"For the clinic team\",\n \"expires_in_hours\": 720,\n \"max_uses\": 5\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.jobbit.uk/v1/projects/{project_id}/invites")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"role\": \"viewer\",\n \"label\": \"For the clinic team\",\n \"expires_in_hours\": 720,\n \"max_uses\": 5\n}"
response = http.request(request)
puts response.read_body{
"id": "inv_8d3f1a07c2",
"project_id": "e57b2a93-0d6c-4f18-9a41-83c1d7e0b2f4",
"role": "viewer",
"label": "For the clinic team",
"url": "https://jobbit.uk/projects/join/n4Kq8vXb2RtYw7Lc",
"created_by": "7b0e2c4a-1d3f-4c8e-9a52-6f1d0e8b3a77",
"created_at": "2026-11-05T15:00:00",
"expires_at": "2026-12-05T15:00:00",
"max_uses": 5,
"uses": 0,
"revoked_at": null,
"is_active": true,
"joined_count": 0
}{
"error": {
"code": "bad_request",
"message": "A project can have 10 live links at once. Turn one off before making another.",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "invalid_key",
"message": "the API key is missing or invalid",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "insufficient_scope",
"message": "this key does not have the deploy:write permission",
"details": {
"required": "deploy:write"
},
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "not_found",
"message": "no such project or item",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "invalid_request",
"message": "the request is not valid",
"details": [
{
"location": [
"body",
"name"
],
"message": "String should match pattern '^[a-z0-9][a-z0-9-]*$'",
"type": "string_pattern_mismatch"
}
],
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "rate_limited",
"message": "too many read requests, retry in 4 s",
"details": {
"group": "read",
"limit": 120,
"window_seconds": 60
},
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}Create an invite link
Creates a link that lets people join the project with a role. Only the owner can. A project may have a limited number of live links at once.
Requires the projects:write permission.
curl --request POST \
--url https://platform.jobbit.uk/v1/projects/{project_id}/invites \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"role": "viewer",
"label": "For the clinic team",
"expires_in_hours": 720,
"max_uses": 5
}
'import requests
url = "https://platform.jobbit.uk/v1/projects/{project_id}/invites"
payload = {
"role": "viewer",
"label": "For the clinic team",
"expires_in_hours": 720,
"max_uses": 5
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
role: 'viewer',
label: 'For the clinic team',
expires_in_hours: 720,
max_uses: 5
})
};
fetch('https://platform.jobbit.uk/v1/projects/{project_id}/invites', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://platform.jobbit.uk/v1/projects/{project_id}/invites",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'role' => 'viewer',
'label' => 'For the clinic team',
'expires_in_hours' => 720,
'max_uses' => 5
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://platform.jobbit.uk/v1/projects/{project_id}/invites"
payload := strings.NewReader("{\n \"role\": \"viewer\",\n \"label\": \"For the clinic team\",\n \"expires_in_hours\": 720,\n \"max_uses\": 5\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://platform.jobbit.uk/v1/projects/{project_id}/invites")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"role\": \"viewer\",\n \"label\": \"For the clinic team\",\n \"expires_in_hours\": 720,\n \"max_uses\": 5\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.jobbit.uk/v1/projects/{project_id}/invites")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"role\": \"viewer\",\n \"label\": \"For the clinic team\",\n \"expires_in_hours\": 720,\n \"max_uses\": 5\n}"
response = http.request(request)
puts response.read_body{
"id": "inv_8d3f1a07c2",
"project_id": "e57b2a93-0d6c-4f18-9a41-83c1d7e0b2f4",
"role": "viewer",
"label": "For the clinic team",
"url": "https://jobbit.uk/projects/join/n4Kq8vXb2RtYw7Lc",
"created_by": "7b0e2c4a-1d3f-4c8e-9a52-6f1d0e8b3a77",
"created_at": "2026-11-05T15:00:00",
"expires_at": "2026-12-05T15:00:00",
"max_uses": 5,
"uses": 0,
"revoked_at": null,
"is_active": true,
"joined_count": 0
}{
"error": {
"code": "bad_request",
"message": "A project can have 10 live links at once. Turn one off before making another.",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "invalid_key",
"message": "the API key is missing or invalid",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "insufficient_scope",
"message": "this key does not have the deploy:write permission",
"details": {
"required": "deploy:write"
},
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "not_found",
"message": "no such project or item",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "invalid_request",
"message": "the request is not valid",
"details": [
{
"location": [
"body",
"name"
],
"message": "String should match pattern '^[a-z0-9][a-z0-9-]*$'",
"type": "string_pattern_mismatch"
}
],
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "rate_limited",
"message": "too many read requests, retry in 4 s",
"details": {
"group": "read",
"limit": 120,
"window_seconds": 60
},
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}Authorizations
An API key from Settings → API keys, sent as Authorization: Bearer jb_live_…
Path Parameters
The project id.
Body
The role people get by joining.
editor, viewer A note for yourself.
120Hours until the link stops working. Left out it lives 30 days; null means it never expires.
1 <= x <= 8760How many people may use it. Null or left out means no limit.
1 <= x <= 10000Response
The invite link.
The invite id.
The project.
The role people get by joining.
editor, viewer The link to share.
Whether it works now.
A note for yourself.
Who made it.
When it was made.
When it stops working. Null means never.
How many people may use it. Null means no limit.
How many times it was used.
When it was turned off.
People who joined through it and are still members.