mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-29 13:05:46 +00:00
222 lines
5.8 KiB
Markdown
222 lines
5.8 KiB
Markdown
|
# Device invites
|
||
|
|
||
|
A device invite is an invitation that shares a device with an external user (a user not in the device's tailnet).
|
||
|
|
||
|
Each device invite has a unique ID that is used to identify the invite in API calls.
|
||
|
You can find all device invite IDs for a particular device by [listing all device invites for a device](#list-device-invites).
|
||
|
|
||
|
### Attributes
|
||
|
|
||
|
```jsonc
|
||
|
{
|
||
|
// id (strings) is the unique identifier for the invite.
|
||
|
// Supply this value wherever {deviceInviteId} is indicated in the endpoint.
|
||
|
"id": "12346",
|
||
|
|
||
|
// created is the creation time of the invite.
|
||
|
"created": "2024-04-03T21:38:49.333829261Z",
|
||
|
|
||
|
// tailnetId is the ID of the tailnet to which the shared device belongs.
|
||
|
"tailnetId": 59954,
|
||
|
|
||
|
// deviceId is the ID of the device being shared.
|
||
|
"deviceId": 11055,
|
||
|
|
||
|
// sharerId is the ID of the user who created the share invite.
|
||
|
"sharerId": 22012,
|
||
|
|
||
|
// multiUse specifies whether this device invite can be accepted more than
|
||
|
// once.
|
||
|
"multiUse": false,
|
||
|
|
||
|
// allowExitNode specifies whether the invited user is able to use the
|
||
|
// device as an exit node when the device is advertising as one.
|
||
|
"allowExitNode": true,
|
||
|
|
||
|
// email is the email to which the invite was sent.
|
||
|
// If empty, the invite was not emailed to anyone, but the inviteUrl can be
|
||
|
// shared manually.
|
||
|
"email": "user@example.com",
|
||
|
|
||
|
// lastEmailSentAt is the last time the invite was attempted to be sent to
|
||
|
// Email. Only ever set if Email is not empty.
|
||
|
"lastEmailSentAt": "2024-04-03T21:38:49.333829261Z",
|
||
|
|
||
|
// inviteUrl is the link to accept the invite.
|
||
|
// Anyone with this link can accept the invite.
|
||
|
// It is not restricted to the person to which the invite was emailed.
|
||
|
"inviteUrl": "https://login.tailscale.com/admin/invite/<code>",
|
||
|
|
||
|
// accepted is true when share invite has been accepted.
|
||
|
"accepted": true,
|
||
|
|
||
|
// acceptedBy is set when the invite has been accepted.
|
||
|
// It holds information about the user who accepted the share invite.
|
||
|
"acceptedBy": {
|
||
|
// id is the ID of the user who accepted the share invite.
|
||
|
"id": 33223,
|
||
|
|
||
|
// loginName is the login name of the user who accepted the share invite.
|
||
|
"loginName": "someone@example.com",
|
||
|
|
||
|
// profilePicUrl is optionally the profile pic URL for the user who accepted
|
||
|
// the share invite.
|
||
|
"profilePicUrl": ""
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
# API
|
||
|
|
||
|
**[Device invites](#device-invites)**
|
||
|
|
||
|
- Get device invite: [`GET /api/v2/device-invites/{deviceInviteId}`](#get-device-invite)
|
||
|
- Delete device invite: [`DELETE /api/v2/device-invites/{deviceInviteId}`](#delete-device-invite)
|
||
|
- Resend device invite (by email): [`POST /api/v2/device-invites/{deviceInviteId}/resend`](#resend-device-invite)
|
||
|
- Accept device invite [`POST /api/v2/device-invites/-/accept`](#accept-device-invite)
|
||
|
|
||
|
## Get device invite
|
||
|
|
||
|
```http
|
||
|
GET /api/v2/device-invites/{deviceInviteId}
|
||
|
```
|
||
|
|
||
|
Retrieve the specified device invite.
|
||
|
|
||
|
### Parameters
|
||
|
|
||
|
#### `deviceInviteId` (required in URL path)
|
||
|
|
||
|
The ID of the device share invite.
|
||
|
|
||
|
### Request example
|
||
|
|
||
|
```sh
|
||
|
curl "https://api.tailscale.com/api/v2/device-invites/12346" \
|
||
|
-u "tskey-api-xxxxx:"
|
||
|
```
|
||
|
|
||
|
### Response
|
||
|
|
||
|
```jsonc
|
||
|
{
|
||
|
"id": "12346",
|
||
|
"created": "2024-04-03T21:38:49.333829261Z",
|
||
|
"tailnetId": 59954,
|
||
|
"deviceId": 11055,
|
||
|
"sharerId": 22012,
|
||
|
"multiUse": true,
|
||
|
"allowExitNode": true,
|
||
|
"email": "user@example.com",
|
||
|
"lastEmailSentAt": "2024-04-03T21:38:49.333829261Z",
|
||
|
"inviteUrl": "https://login.tailscale.com/admin/invite/<code>",
|
||
|
"accepted": false
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Delete device invite
|
||
|
|
||
|
```http
|
||
|
DELETE /api/v2/device-invites/{deviceInviteId}
|
||
|
```
|
||
|
|
||
|
Delete the specified device invite.
|
||
|
|
||
|
### Parameters
|
||
|
|
||
|
#### `deviceInviteId` (required in URL path)
|
||
|
|
||
|
The ID of the device share invite.
|
||
|
|
||
|
### Request example
|
||
|
|
||
|
```sh
|
||
|
curl -X DELETE "https://api.tailscale.com/api/v2/device-invites/12346" \
|
||
|
-u "tskey-api-xxxxx:"
|
||
|
```
|
||
|
|
||
|
### Response
|
||
|
|
||
|
The response is 2xx on success. The response body is an empty JSON object.
|
||
|
|
||
|
## Resend device invite
|
||
|
|
||
|
```http
|
||
|
POST /api/v2/device-invites/{deviceInviteId}/resend
|
||
|
```
|
||
|
|
||
|
Resend the specified device invite by email. You can only use this if the specified invite was originally created with an email specified. Refer to [creating device invites for a device](#create-device-invites).
|
||
|
|
||
|
Note: Invite resends are rate limited to one per minute.
|
||
|
|
||
|
### Parameters
|
||
|
|
||
|
#### `deviceInviteId` (required in URL path)
|
||
|
|
||
|
The ID of the device share invite.
|
||
|
|
||
|
### Request example
|
||
|
|
||
|
```sh
|
||
|
curl -X POST "https://api.tailscale.com/api/v2/device-invites/12346/resend" \
|
||
|
-u "tskey-api-xxxxx:"
|
||
|
```
|
||
|
|
||
|
### Response
|
||
|
|
||
|
The response is 2xx on success. The response body is an empty JSON object.
|
||
|
|
||
|
## Accept device invite
|
||
|
|
||
|
```http
|
||
|
POST /api/v2/device-invites/-/accept
|
||
|
```
|
||
|
|
||
|
Resend the specified device invite by email. This can only be used if the specified invite was originally created with an email specified.
|
||
|
See [creating device invites for a device](#create-device-invites).
|
||
|
|
||
|
Note that invite resends are rate limited to once per minute.
|
||
|
|
||
|
### Parameters
|
||
|
|
||
|
#### `invite` (required in `POST` body)
|
||
|
|
||
|
The URL of the invite (in the form "https://login.tailscale.com/admin/invite/{code}") or the "{code}" component of the URL.
|
||
|
|
||
|
### Request example
|
||
|
|
||
|
```sh
|
||
|
curl -X POST "https://api.tailscale.com/api/v2/device-invites/-/accept" \
|
||
|
-u "tskey-api-xxxxx:" \
|
||
|
-H "Content-Type: application/json" \
|
||
|
--data-binary '[{"invite": "https://login.tailscale.com/admin/invite/xxxxxx"}]'
|
||
|
```
|
||
|
|
||
|
### Response
|
||
|
|
||
|
```jsonc
|
||
|
{
|
||
|
"device": {
|
||
|
"id": "11055",
|
||
|
"os": "iOS",
|
||
|
"name": "my-phone",
|
||
|
"fqdn": "my-phone.something.ts.net",
|
||
|
"ipv4": "100.x.y.z",
|
||
|
"ipv6": "fd7a:115c:x::y:z",
|
||
|
"includeExitNode": false
|
||
|
},
|
||
|
"sharer": {
|
||
|
"id": "22012",
|
||
|
"displayName": "Some User",
|
||
|
"loginName": "someuser@example.com",
|
||
|
"profilePicURL": ""
|
||
|
},
|
||
|
"acceptedBy": {
|
||
|
"id": "33233",
|
||
|
"displayName": "Another User",
|
||
|
"loginName": "anotheruser@exmaple2.com",
|
||
|
"profilePicURL": ""
|
||
|
}
|
||
|
}
|
||
|
```
|