OpenAPI Specification
openapi: 3.0.0
info:
contact:
email: hey@slide.tech
name: Slide Team
url: https://docs.slide.tech
description: "## Introduction\nThe Slide API is organized around REST. Our API has predictable resource-oriented URLs, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.\n\n## Authentication\nWe use API tokens to authenticate requests. You can view and manage your API tokens in the [Slide Console](https://docs.slide.tech).\nWhen making HTTP requests, you'll need to include the API token in the `Authorization` header, using Bearer auth (e.g. `Authorization: Bearer YOUR_SECRET_TOKEN`).\n\nExample:\n```shell\n$ curl -H 'Authorization: Bearer YOUR_SECRET_TOKEN' 'https://api.slide.tech/v1/device'\n```\n\n## Pagination\nAll list endpoints support pagination. You can use the `limit` and `offset` query parameters to control the number of items returned and the starting index.\nList responses will include a `pagination` key that includes the `next_offset` to use for pagination.\nIf `next_offset` is not present, that indicates there are no more items to fetch.\n\nExample:\n```shell\n$ curl -H 'Authorization: Bearer YOUR_SECRET_TOKEN' \\\n 'https://api.slide.tech/v1/device?offset=0&limit=10'\n{\n \"pagination\": {\n \"next_offset\": 10\n },\n \"data\": [\n ...\n ]\n}\n```\n\n## Rate Limiting\nWe limit the number of requests you can make to the API within a certain time frame.\nEach API token has a pool of `50` requests. We refill this pool at a rate of `10` requests per second.\nIf you exceed the rate limit, you'll receive a response with a `429 Too Many Requests` HTTP code and a `err_rate_limit_exceeded` error code.\nPlease wait before retrying the request. We recommend you implement an exponential backoff strategy to handle rate limits.\n\n## Errors\nSlide uses conventional HTTP response codes to indicate the success or failure of an API request.\nIn general, codes in the 2xx range indicate success, codes in the 4xx range indicate an error that failed given the information provided (e.g., a required parameter was omitted), and codes in the 5xx range indicate an error with Slide's servers.\n\nWe also include [error codes and details](#model/error) in the response, which may provide more context about the error.\n\nExample:\n```shell\n$ curl 'https://api.slide.tech/v1/device'\n{\n \"codes\": [\n \"err_missing_authentication\"\n ],\n \"details\": [\n ...\n ],\n \"message\": \"unauthorized\"\n}\n```\n\nSome common error codes are:\n\n| Code | Description |\n|------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `err_endpoint_not_found` | Requested endpoint does not exist. |\n| `err_entity_not_found` | Requested entity does not exist. |\n| `err_validation_error` | Bad request due to validation error. The error `details` will contain any fields that were not valid. |\n| `err_missing_authentication` | Unauthorized due to missing API token. See [authentication](#description/authentication) for more details. |\n| `err_unauthorized` | Unauthorized due to invalid API token. You've provided an invalid API token or the API token does not have permission to access the requested resource. |\n| `err_internal_server_error` | Something went wrong. If you retry the request and it does not succeed, you may contact us at `hey@slide.tech`. |\n| `err_rate_limit_exceeded` | Rate limit exceeded. Please wait before retrying the request. See [rate limiting](#description/rate-limiting) for more details. |\n\n<details>\n <summary>Show more error codes.</summary>\n\n| Code | Description |\n|-------------------------------------|-----------------------------------------------------------------------------------------------------------------------|\n| `err_agent_not_connected_to_device` | Agent is not connected to the device. Ensure the agent is powered on and has network connectivity. |\n| `err_device_not_connected_to_cloud` | Device is not connected to the cloud. Ensure the device is powered on and has network connectivity. |\n| `err_backup_already_running` | A backup is already running for this agent. Please wait for the current backup to complete before starting a new one. |\n| `err_client_not_found` | Client not found. Ensure the client ID is valid and the client exists. |\n\n</details>\n\n## Eventual Consistency\n\nSlide operates an eventual consistency model, where data may not be immediately available after an operation.\nThis is due to the distributed nature of our system and the need for replication and synchronization across multiple\nsystems. Users should expect that operations may take a short period of time to propagate and become visible to all\ncomponents of the system.\n\n## Deprecations and Breaking Changes\n\n### Active Deprecations\n\n`Device.ip_addresses` and `Agent.ip_addresses` will be removed. They have been replaced by `Device.addresses` and `Agent.addresses` respectively.\n"
title: Slide Accounts Networks API
version: 1.34.0
servers:
- url: https://api.slide.tech
security:
- BearerAuth: []
tags:
- description: Everything about [networks](#model/network)
name: Networks
paths:
/v1/network:
get:
operationId: Networks
parameters:
- $ref: '#/components/parameters/QueryClientID'
- $ref: '#/components/parameters/QueryOffset'
- $ref: '#/components/parameters/QueryLimit'
- description: Sort by a specific field
in: query
name: sort_by
schema:
default: id
enum:
- id
type: string
- $ref: '#/components/parameters/QuerySortAsc'
- $ref: '#/components/parameters/QueryCreatedAfter'
- $ref: '#/components/parameters/QueryCreatedBefore'
responses:
'200':
content:
application/json:
schema:
description: Paginated response
properties:
data:
description: List of networks
items:
$ref: '#/components/schemas/Network'
title: Networks
type: array
pagination:
$ref: '#/components/schemas/Pagination'
required:
- pagination
- data
title: Paginated response
type: object
description: OK
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'500':
$ref: '#/components/responses/500'
summary: List networks
tags:
- Networks
post:
operationId: NetworkCreate
requestBody:
content:
application/json:
examples:
bridgedNetworking:
summary: Bridged networking configuration
value:
bridge_device_id: d_0123456789ab
client_id: c_0123456789ab
name: My Bridge to LAN Network
type: bridge-lan
vlan_tag: 100
standardNetworking:
summary: Standard networking configuration
value:
client_id: c_0123456789ab
dhcp: true
dhcp_range_end: 10.0.0.200
dhcp_range_start: 10.0.0.100
name: My Disaster Recovery Network
nameservers:
- 1.1.1.1
- 1.0.0.1
router_prefix: 10.0.0.1/24
type: standard
wg: true
schema:
properties:
bridge_device_id:
$ref: '#/components/schemas/DeviceID'
client_id:
$ref: '#/components/schemas/ClientIDOrEmpty'
comments:
$ref: '#/components/schemas/NetworkComments'
dhcp:
description: Whether the disaster network should have DHCP
example: true
type: boolean
dhcp_range_end:
description: DHCP range end for the network
example: 10.0.0.200
type: string
dhcp_range_start:
description: DHCP range start for the network
example: 10.0.0.100
type: string
internet:
description: Whether the network should have Internet access
example: true
type: boolean
name:
$ref: '#/components/schemas/DisasterNetworkName'
nameservers:
description: List of DNS servers
example:
- 1.1.1.1
- 1.0.0.1
items:
type: string
type: array
router_prefix:
description: Router IP and netmask for the network
example: 10.0.0.1/24
type: string
type:
$ref: '#/components/schemas/DisasterNetworkType'
vlan_tag:
description: VLAN tag for bridge-LAN networks (0 = no tagging, 1-4094 = tagged)
example: 100
type: integer
wg:
description: Whether the network should have WireGuard enabled
example: true
type: boolean
wg_prefix:
description: WireGuard IP address and netmask for the WireGuard network
example: 192.168.178.1/24
type: string
required:
- name
- type
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/Network'
description: Created
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'409':
$ref: '#/components/responses/409'
'500':
$ref: '#/components/responses/500'
summary: Create network
tags:
- Networks
/v1/network/{network_id}:
delete:
operationId: NetworkDelete
parameters:
- $ref: '#/components/parameters/PathNetworkID'
responses:
'204':
description: No Content
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'500':
$ref: '#/components/responses/500'
summary: Delete network
tags:
- Networks
get:
operationId: NetworkByID
parameters:
- $ref: '#/components/parameters/PathNetworkID'
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Network'
description: OK
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'500':
$ref: '#/components/responses/500'
summary: Get network
tags:
- Networks
patch:
operationId: NetworkUpdate
parameters:
- $ref: '#/components/parameters/PathNetworkID'
requestBody:
content:
application/json:
example: "{\n \"name\": \"My Bridge to LAN Network\",\n \"comments\": \"This is a replacement network\"\n}"
schema:
properties:
client_id:
$ref: '#/components/schemas/ClientIDOrEmpty'
comments:
$ref: '#/components/schemas/NetworkComments'
dhcp:
description: Whether the disaster network should have DHCP
example: true
type: boolean
dhcp_range_end:
description: DHCP range end for the network
example: 10.0.0.200
type: string
dhcp_range_start:
description: DHCP range start for the network
example: 10.0.0.100
type: string
internet:
description: Whether the network should have Internet access
example: true
type: boolean
name:
$ref: '#/components/schemas/DisasterNetworkName'
nameservers:
description: List of DNS servers
example:
- 1.1.1.1
- 1.0.0.1
items:
type: string
type: array
router_prefix:
description: Router IP and netmask for the network
example: 10.0.0.1/24
type: string
vlan_tag:
description: VLAN tag for bridge-LAN networks (0 = no tagging, 1-4094 = tagged)
example: 100
type: integer
wg:
description: Whether the network should have WireGuard enabled
example: true
type: boolean
wg_prefix:
description: WireGuard IP address and netmask for the WireGuard network
example: 192.168.178.1/24
type: string
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/Network'
description: Updated
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'500':
$ref: '#/components/responses/500'
summary: Update network
tags:
- Networks
/v1/network/{network_id}/ipsec:
post:
operationId: NetworkIPSecConnCreate
parameters:
- $ref: '#/components/parameters/PathNetworkID'
requestBody:
content:
application/json:
example: "{\n \"name\": \"InfoSec IT, 192.168.200.0/24 subnet\",\n \"remote_addrs\": [\"1.2.3.4\"],\n \"remote_networks\": [\"10.0.0.0/24\", \"10.10.0.0/24\"]\n}"
schema:
properties:
name:
description: Name of the IPsec connection
example: InfoSec IT Site-to-Site
type: string
remote_addrs:
description: Public IP addresses of the partner-side of the router/firewall
items:
description: Public IP address used to connect to the Slide Cloud network's IPsec connection
example: 1.2.3.4
title: Public IP Address
type: string
type: array
remote_networks:
description: List of partner-side networks that are accessible through the IPsec connection
items:
example: 10.0.0.0/24
title: Network in CIDR format
type: string
type: array
required:
- name
- remote_addrs
- remote_networks
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/NetworkIPSecConn'
description: Created
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'409':
$ref: '#/components/responses/409'
'500':
$ref: '#/components/responses/500'
summary: Create IPsec connection
tags:
- Networks
/v1/network/{network_id}/ipsec/{ipsec_id}:
delete:
operationId: NetworkIPSecConnDelete
parameters:
- $ref: '#/components/parameters/PathNetworkID'
- $ref: '#/components/parameters/PathIPSecID'
responses:
'204':
description: No Content
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'500':
$ref: '#/components/responses/500'
summary: Delete IPsec connection
tags:
- Networks
patch:
operationId: NetworkIPSecConnUpdate
parameters:
- $ref: '#/components/parameters/PathNetworkID'
- $ref: '#/components/parameters/PathIPSecID'
requestBody:
content:
application/json:
examples:
updateName:
summary: Update name of the IPsec connection
value:
name: InfoSec IT Site-to-Site
updateRemoteAddrs:
summary: Update remote IP addresses of the IPsec connection
value:
remote_addrs:
- 10.0.0.0/24
- 10.20.0.0/24
schema:
properties:
name:
description: Name of the IPsec connection
example: tcp
type: string
remote_addrs:
description: Public IP addresses of the partner-side of the router/firewall
items:
description: Public IP address used to connect to the Slide Cloud network's IPsec connection
example: 1.2.3.4
title: Public IP Address
type: string
type: array
remote_networks:
description: List of partner-side networks that are accessible through the IPsec connection
items:
example: 10.0.0.0/24
title: Network in CIDR format
type: string
type: array
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/NetworkIPSecConn'
description: OK
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'409':
$ref: '#/components/responses/409'
'500':
$ref: '#/components/responses/500'
summary: Update IPsec connection
tags:
- Networks
/v1/network/{network_id}/port-forward:
post:
operationId: NetworkPortForwardCreate
parameters:
- $ref: '#/components/parameters/PathNetworkID'
requestBody:
content:
application/json:
example: "{\n \"proto\": \"tcp\",\n \"dest\": \"10.0.0.100:25881\"\n}"
schema:
properties:
dest:
description: Destination IP address and port pair
example: 10.0.0.100:80
type: string
proto:
description: Protocol, tcp or udp
example: tcp
type: string
required:
- proto
- dest
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/NetworkPortForward'
description: Created
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'500':
$ref: '#/components/responses/500'
summary: Create port forward
tags:
- Networks
/v1/network/{network_id}/port-forward/{port_forward_id}:
delete:
operationId: NetworkPortForwardDelete
parameters:
- $ref: '#/components/parameters/PathNetworkID'
- $ref: '#/components/parameters/PathPortForwardID'
responses:
'204':
description: No Content
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'500':
$ref: '#/components/responses/500'
summary: Delete port forward
tags:
- Networks
patch:
operationId: NetworkPortForwardUpdate
parameters:
- $ref: '#/components/parameters/PathNetworkID'
- $ref: '#/components/parameters/PathPortForwardID'
requestBody:
content:
application/json:
example: "{\n \"proto\": \"tcp\",\n \"dest\": \"10.0.0.100:25881\"\n}"
schema:
properties:
dest:
description: Destination IP address and port pair
example: 10.0.0.100:80
type: string
proto:
description: Protocol, tcp or udp
example: tcp
type: string
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/NetworkPortForward'
description: Updated
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'500':
$ref: '#/components/responses/500'
summary: Update port forward
tags:
- Networks
/v1/network/{network_id}/wg-peer:
post:
operationId: NetworkWGPeerCreate
parameters:
- $ref: '#/components/parameters/PathNetworkID'
requestBody:
content:
application/json:
example: "{\n \"peer_name\": \"My Bridge to LAN Network\",\n \"remote_networks\": [\"10.80.0.0/24\", \"10.80.1.0/24\"]\n}"
schema:
properties:
peer_name:
description: Name of the WireGuard client
example: My PC
type: string
remote_networks:
$ref: '#/components/schemas/RemoteNetworks'
required:
- peer_name
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/NetworkWGPeer'
description: Created
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'500':
$ref: '#/components/responses/500'
summary: Create WireGuard peer
tags:
- Networks
/v1/network/{network_id}/wg-peer/{wg_peer_id}:
delete:
operationId: NetworkWGPeerDelete
parameters:
- $ref: '#/components/parameters/PathNetworkID'
- $ref: '#/components/parameters/PathWGPeerID'
responses:
'204':
description: No Content
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'500':
$ref: '#/components/responses/500'
summary: Delete WireGuard peer
tags:
- Networks
patch:
operationId: NetworkWGPeerUpdate
parameters:
- $ref: '#/components/parameters/PathNetworkID'
- $ref: '#/components/parameters/PathWGPeerID'
requestBody:
content:
application/json:
example: "{\n \"peer_name\": \"My Bridge to LAN Network\",\n \"remote_networks\": [\"10.80.0.0/24\", \"10.80.1.0/24\"]\n}"
schema:
properties:
peer_name:
description: Name of the WireGuard client
example: My PC
type: string
remote_networks:
$ref: '#/components/schemas/RemoteNetworks'
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/NetworkWGPeer'
description: Updated
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'404':
$ref: '#/components/responses/404'
'500':
$ref: '#/components/responses/500'
summary: Update WireGuard peer
tags:
- Networks
components:
schemas:
ClientID:
description: ID of a client
example: c_0123456789ab
pattern: ^c_[a-z0-9]{12}$
type: string
DeviceID:
description: ID of a device
example: d_0123456789ab
pattern: ^d_[a-z0-9]{12}$
type: string
NetworkWGPeer:
description: NetworkWGPeer object that represents a WireGuard client.
properties:
peer_name:
description: Name of the WireGuard client
example: My PC
type: string
remote_networks:
$ref: '#/components/schemas/RemoteNetworks'
wg_address:
description: WireGuard address of this peer, part of the network defined in wg_prefix
example: 10.0.0.100
type: string
wg_endpoint:
description: Address of the WireGuard endpoint that this peer connects to
example: use1-prod-gateway-1.slide.tech:51820
type: string
wg_peer_id:
$ref: '#/components/schemas/WGPeerID'
wg_private_key:
description: WireGuard private key of this peer
example: INRPOJHOzuMiRzim2tzzU2OU7Z3jNOIS4HRVA32NzUY
type: string
wg_public_key:
description: WireGuard public key of this peer
example: buRAPDIX5SMlPlzLsLO8WVaWe+1+FXf+TKk26e4Vkm8=
type: string
required:
- wg_peer_id
- peer_name
- wg_public_key
- wg_private_key
- wg_address
- wg_endpoint
- remote_networks
type: object
NetworkID:
description: ID of an network
example: net_012345
pattern: ^net_[a-z0-9]{6}$
type: string
PortForwardID:
description: ID of a port forward definition
example: pfw_0123456789ab
pattern: ^pfw_[a-z0-9]{12}$
type: string
DisasterNetworkName:
description: Name of the network
example: Bridge to LAN Network
maxLength: 128
minLength: 1
type: string
DisasterNetworkType:
description: Network type of the disaster network
enum:
- standard
- bridge-lan
example: standard
type: string
NetworkPortForward:
description: NetworkPortForward object that represents a port forwarding.
properties:
dest:
description: Destination IP address and port pair
example: 10.0.0.100:80
type: string
endpoint:
description: Public host:port pair of the public gateway of the port forward
example: use1-prod-gateway-1.slide.tech:25881
pattern: ^[0-9a-zA-Z.-]+:[0-9]+$
type: string
port:
description: Listen port number on the public gateway
example: 25881
type: integer
port_forward_id:
$ref: '#/components/schemas/PortForwardID'
proto:
description: Protocol, tcp or udp
example: tcp
type: string
required:
- port_forward_id
- proto
- port
- dest
type: object
NetworkIPSecConn:
description: NetworkIPsecConn object that represents an IPsec connection into a network.
properties:
ipsec_id:
$ref: '#/components/schemas/IPSecID'
local_addrs:
description: Public IP addresses of the Slide Cloud gateway that manages the IPsec connection
items:
description: Public IP address of the Slide Cloud gateway
example: 1.2.3.4
title: Public IP Address
type: string
type: array
local_id:
description: Identifier for the Slide Cloud-side of the IPsec connection
example: ipsec_0123456789ab_slide
type: string
local_networks:
description: List of Slide-side networks that are accessible through the IPsec connection
items:
example: 10.0.0.0/24
title: Network in CIDR format
type: string
type: array
name:
description: Name of the IPsec connection
example: Dental Associates, Main Office
type: string
psk:
description: Pre-shared key for the IPsec connection
example: buRAPDIX5SMlPlzLsLO8WVaWeFXam1Aa
type: string
remote_addrs:
description: Public IP addresses of the partner-side of the router/firewall
items:
description: Public IP address used to connect to the Slide Cloud network's IPsec connection
example: 1.2.3.4
title: Public IP Address
type: string
type: array
remote_id:
description: Identifier for the partner-side of the IPsec connection
example: ipsec_0123456789ab_partner
type: string
remote_networks:
description: List of partner-side networks that are accessible through the IPsec connection
items:
example: 10.0.0.0/24
title: Network in CIDR format
type: string
type: array
required:
- ipsec_id
- name
- psk
- local_id
- local_addrs
- local_networks
- remote_id
- remote_addrs
- remote_networks
type: object
ClientIDOrEmpty:
description: ID of a client or an empty string
example: c_0123456789ab
pattern: ^(c_[a-z0-9]{12}|)$
type: string
IPSecID:
description: ID of an IPsec connection
example: ipsec_0123456789ab
pattern: ^ipsec_[a-z0-9]{12}$
type: string
WGPeerID:
description: ID of a WireGuard peer
example: wgp_0123456789ab
pattern: ^wgp_[a-z0-9]{12}$
type: string
Network:
description: Network object that represents a network.
properties:
bridge_device_id:
$ref: '#/components/schemas/DeviceID'
client_id:
$ref: '#/components/schemas/ClientID'
comments:
description: Comments about the network
example: This is a test network
type: string
connected_virt_ids:
description: List of the virtual machines connected to the network.
items:
$ref: '#/components/schemas/VirtID'
type: array
dhcp:
description: Whether the disaster network should have DHCP
example: true
type: boolean
dhcp_range_end:
description: DHCP range end for the network
example: 10.0.0.200
type: string
dhcp_range_start:
description: DHCP range start for the network
example: 10.0.0.100
type: strin
# --- truncated at 32 KB (39 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/slide/refs/heads/main/openapi/slide-networks-api-openapi.yml