curl --request POST \
--url https://api.shadeform.ai/v1/templates/save \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"name": "My Template",
"description": "A template for ML workloads",
"public": true,
"auto_delete": {
"date_threshold": "2006-01-02T15:04:05-07:00",
"spend_threshold": "3.14"
},
"alert": {
"date_threshold": "2006-01-02T15:04:05-07:00",
"spend_threshold": "3.14"
},
"volume_mount": {
"auto": true
},
"tags": [
"ml",
"pytorch"
],
"envs": [
{
"name": "HUGGING_FACE_HUB_TOKEN",
"value": "hugging_face_api_token"
}
],
"networking": {
"ufw_rules": [
{
"rule": "allow",
"from_ip": "192.168.1.0/24",
"to_ip": "10.0.0.0/8",
"port": "80",
"proto": "tcp"
}
]
}
}
'import requests
url = "https://api.shadeform.ai/v1/templates/save"
payload = {
"name": "My Template",
"description": "A template for ML workloads",
"public": True,
"auto_delete": {
"date_threshold": "2006-01-02T15:04:05-07:00",
"spend_threshold": "3.14"
},
"alert": {
"date_threshold": "2006-01-02T15:04:05-07:00",
"spend_threshold": "3.14"
},
"volume_mount": { "auto": True },
"tags": ["ml", "pytorch"],
"envs": [
{
"name": "HUGGING_FACE_HUB_TOKEN",
"value": "hugging_face_api_token"
}
],
"networking": { "ufw_rules": [
{
"rule": "allow",
"from_ip": "192.168.1.0/24",
"to_ip": "10.0.0.0/8",
"port": "80",
"proto": "tcp"
}
] }
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'My Template',
description: 'A template for ML workloads',
public: true,
auto_delete: {date_threshold: '2006-01-02T15:04:05-07:00', spend_threshold: '3.14'},
alert: {date_threshold: '2006-01-02T15:04:05-07:00', spend_threshold: '3.14'},
volume_mount: {auto: true},
tags: ['ml', 'pytorch'],
envs: [{name: 'HUGGING_FACE_HUB_TOKEN', value: 'hugging_face_api_token'}],
networking: {
ufw_rules: [
{
rule: 'allow',
from_ip: '192.168.1.0/24',
to_ip: '10.0.0.0/8',
port: '80',
proto: 'tcp'
}
]
}
})
};
fetch('https://api.shadeform.ai/v1/templates/save', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.shadeform.ai/v1/templates/save",
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([
'name' => 'My Template',
'description' => 'A template for ML workloads',
'public' => true,
'auto_delete' => [
'date_threshold' => '2006-01-02T15:04:05-07:00',
'spend_threshold' => '3.14'
],
'alert' => [
'date_threshold' => '2006-01-02T15:04:05-07:00',
'spend_threshold' => '3.14'
],
'volume_mount' => [
'auto' => true
],
'tags' => [
'ml',
'pytorch'
],
'envs' => [
[
'name' => 'HUGGING_FACE_HUB_TOKEN',
'value' => 'hugging_face_api_token'
]
],
'networking' => [
'ufw_rules' => [
[
'rule' => 'allow',
'from_ip' => '192.168.1.0/24',
'to_ip' => '10.0.0.0/8',
'port' => '80',
'proto' => 'tcp'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.shadeform.ai/v1/templates/save"
payload := strings.NewReader("{\n \"name\": \"My Template\",\n \"description\": \"A template for ML workloads\",\n \"public\": true,\n \"auto_delete\": {\n \"date_threshold\": \"2006-01-02T15:04:05-07:00\",\n \"spend_threshold\": \"3.14\"\n },\n \"alert\": {\n \"date_threshold\": \"2006-01-02T15:04:05-07:00\",\n \"spend_threshold\": \"3.14\"\n },\n \"volume_mount\": {\n \"auto\": true\n },\n \"tags\": [\n \"ml\",\n \"pytorch\"\n ],\n \"envs\": [\n {\n \"name\": \"HUGGING_FACE_HUB_TOKEN\",\n \"value\": \"hugging_face_api_token\"\n }\n ],\n \"networking\": {\n \"ufw_rules\": [\n {\n \"rule\": \"allow\",\n \"from_ip\": \"192.168.1.0/24\",\n \"to_ip\": \"10.0.0.0/8\",\n \"port\": \"80\",\n \"proto\": \"tcp\"\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.shadeform.ai/v1/templates/save")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"My Template\",\n \"description\": \"A template for ML workloads\",\n \"public\": true,\n \"auto_delete\": {\n \"date_threshold\": \"2006-01-02T15:04:05-07:00\",\n \"spend_threshold\": \"3.14\"\n },\n \"alert\": {\n \"date_threshold\": \"2006-01-02T15:04:05-07:00\",\n \"spend_threshold\": \"3.14\"\n },\n \"volume_mount\": {\n \"auto\": true\n },\n \"tags\": [\n \"ml\",\n \"pytorch\"\n ],\n \"envs\": [\n {\n \"name\": \"HUGGING_FACE_HUB_TOKEN\",\n \"value\": \"hugging_face_api_token\"\n }\n ],\n \"networking\": {\n \"ufw_rules\": [\n {\n \"rule\": \"allow\",\n \"from_ip\": \"192.168.1.0/24\",\n \"to_ip\": \"10.0.0.0/8\",\n \"port\": \"80\",\n \"proto\": \"tcp\"\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shadeform.ai/v1/templates/save")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"My Template\",\n \"description\": \"A template for ML workloads\",\n \"public\": true,\n \"auto_delete\": {\n \"date_threshold\": \"2006-01-02T15:04:05-07:00\",\n \"spend_threshold\": \"3.14\"\n },\n \"alert\": {\n \"date_threshold\": \"2006-01-02T15:04:05-07:00\",\n \"spend_threshold\": \"3.14\"\n },\n \"volume_mount\": {\n \"auto\": true\n },\n \"tags\": [\n \"ml\",\n \"pytorch\"\n ],\n \"envs\": [\n {\n \"name\": \"HUGGING_FACE_HUB_TOKEN\",\n \"value\": \"hugging_face_api_token\"\n }\n ],\n \"networking\": {\n \"ufw_rules\": [\n {\n \"rule\": \"allow\",\n \"from_ip\": \"192.168.1.0/24\",\n \"to_ip\": \"10.0.0.0/8\",\n \"port\": \"80\",\n \"proto\": \"tcp\"\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "d290f1ee-6c54-4b01-90e6-d701748f0851"
}/templates/save
Create a new template
curl --request POST \
--url https://api.shadeform.ai/v1/templates/save \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"name": "My Template",
"description": "A template for ML workloads",
"public": true,
"auto_delete": {
"date_threshold": "2006-01-02T15:04:05-07:00",
"spend_threshold": "3.14"
},
"alert": {
"date_threshold": "2006-01-02T15:04:05-07:00",
"spend_threshold": "3.14"
},
"volume_mount": {
"auto": true
},
"tags": [
"ml",
"pytorch"
],
"envs": [
{
"name": "HUGGING_FACE_HUB_TOKEN",
"value": "hugging_face_api_token"
}
],
"networking": {
"ufw_rules": [
{
"rule": "allow",
"from_ip": "192.168.1.0/24",
"to_ip": "10.0.0.0/8",
"port": "80",
"proto": "tcp"
}
]
}
}
'import requests
url = "https://api.shadeform.ai/v1/templates/save"
payload = {
"name": "My Template",
"description": "A template for ML workloads",
"public": True,
"auto_delete": {
"date_threshold": "2006-01-02T15:04:05-07:00",
"spend_threshold": "3.14"
},
"alert": {
"date_threshold": "2006-01-02T15:04:05-07:00",
"spend_threshold": "3.14"
},
"volume_mount": { "auto": True },
"tags": ["ml", "pytorch"],
"envs": [
{
"name": "HUGGING_FACE_HUB_TOKEN",
"value": "hugging_face_api_token"
}
],
"networking": { "ufw_rules": [
{
"rule": "allow",
"from_ip": "192.168.1.0/24",
"to_ip": "10.0.0.0/8",
"port": "80",
"proto": "tcp"
}
] }
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'My Template',
description: 'A template for ML workloads',
public: true,
auto_delete: {date_threshold: '2006-01-02T15:04:05-07:00', spend_threshold: '3.14'},
alert: {date_threshold: '2006-01-02T15:04:05-07:00', spend_threshold: '3.14'},
volume_mount: {auto: true},
tags: ['ml', 'pytorch'],
envs: [{name: 'HUGGING_FACE_HUB_TOKEN', value: 'hugging_face_api_token'}],
networking: {
ufw_rules: [
{
rule: 'allow',
from_ip: '192.168.1.0/24',
to_ip: '10.0.0.0/8',
port: '80',
proto: 'tcp'
}
]
}
})
};
fetch('https://api.shadeform.ai/v1/templates/save', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.shadeform.ai/v1/templates/save",
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([
'name' => 'My Template',
'description' => 'A template for ML workloads',
'public' => true,
'auto_delete' => [
'date_threshold' => '2006-01-02T15:04:05-07:00',
'spend_threshold' => '3.14'
],
'alert' => [
'date_threshold' => '2006-01-02T15:04:05-07:00',
'spend_threshold' => '3.14'
],
'volume_mount' => [
'auto' => true
],
'tags' => [
'ml',
'pytorch'
],
'envs' => [
[
'name' => 'HUGGING_FACE_HUB_TOKEN',
'value' => 'hugging_face_api_token'
]
],
'networking' => [
'ufw_rules' => [
[
'rule' => 'allow',
'from_ip' => '192.168.1.0/24',
'to_ip' => '10.0.0.0/8',
'port' => '80',
'proto' => 'tcp'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.shadeform.ai/v1/templates/save"
payload := strings.NewReader("{\n \"name\": \"My Template\",\n \"description\": \"A template for ML workloads\",\n \"public\": true,\n \"auto_delete\": {\n \"date_threshold\": \"2006-01-02T15:04:05-07:00\",\n \"spend_threshold\": \"3.14\"\n },\n \"alert\": {\n \"date_threshold\": \"2006-01-02T15:04:05-07:00\",\n \"spend_threshold\": \"3.14\"\n },\n \"volume_mount\": {\n \"auto\": true\n },\n \"tags\": [\n \"ml\",\n \"pytorch\"\n ],\n \"envs\": [\n {\n \"name\": \"HUGGING_FACE_HUB_TOKEN\",\n \"value\": \"hugging_face_api_token\"\n }\n ],\n \"networking\": {\n \"ufw_rules\": [\n {\n \"rule\": \"allow\",\n \"from_ip\": \"192.168.1.0/24\",\n \"to_ip\": \"10.0.0.0/8\",\n \"port\": \"80\",\n \"proto\": \"tcp\"\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.shadeform.ai/v1/templates/save")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"My Template\",\n \"description\": \"A template for ML workloads\",\n \"public\": true,\n \"auto_delete\": {\n \"date_threshold\": \"2006-01-02T15:04:05-07:00\",\n \"spend_threshold\": \"3.14\"\n },\n \"alert\": {\n \"date_threshold\": \"2006-01-02T15:04:05-07:00\",\n \"spend_threshold\": \"3.14\"\n },\n \"volume_mount\": {\n \"auto\": true\n },\n \"tags\": [\n \"ml\",\n \"pytorch\"\n ],\n \"envs\": [\n {\n \"name\": \"HUGGING_FACE_HUB_TOKEN\",\n \"value\": \"hugging_face_api_token\"\n }\n ],\n \"networking\": {\n \"ufw_rules\": [\n {\n \"rule\": \"allow\",\n \"from_ip\": \"192.168.1.0/24\",\n \"to_ip\": \"10.0.0.0/8\",\n \"port\": \"80\",\n \"proto\": \"tcp\"\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shadeform.ai/v1/templates/save")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"My Template\",\n \"description\": \"A template for ML workloads\",\n \"public\": true,\n \"auto_delete\": {\n \"date_threshold\": \"2006-01-02T15:04:05-07:00\",\n \"spend_threshold\": \"3.14\"\n },\n \"alert\": {\n \"date_threshold\": \"2006-01-02T15:04:05-07:00\",\n \"spend_threshold\": \"3.14\"\n },\n \"volume_mount\": {\n \"auto\": true\n },\n \"tags\": [\n \"ml\",\n \"pytorch\"\n ],\n \"envs\": [\n {\n \"name\": \"HUGGING_FACE_HUB_TOKEN\",\n \"value\": \"hugging_face_api_token\"\n }\n ],\n \"networking\": {\n \"ufw_rules\": [\n {\n \"rule\": \"allow\",\n \"from_ip\": \"192.168.1.0/24\",\n \"to_ip\": \"10.0.0.0/8\",\n \"port\": \"80\",\n \"proto\": \"tcp\"\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "d290f1ee-6c54-4b01-90e6-d701748f0851"
}Authorizations
Body
Name of the template
"My Template"
Description of the template
"A template for ML workloads"
Whether the template is publicly available
true
Defines automatic actions after the instance becomes active.
Show child attributes
Show child attributes
Set a date or spend threshold to automatically delete the instance
Show child attributes
Show child attributes
Alert configuration
Show child attributes
Show child attributes
Volume mount configuration
Show child attributes
Show child attributes
Tags associated with the template
["ml", "pytorch"]Environment variables for the template
Show child attributes
Show child attributes
Network and firewall configuration
Show child attributes
Show child attributes
Response
Returns a TemplateCreateResponse object
Response of the /templates/save API call
The unique identifier for the instance. Used in the instances for the /instances/{id}/info and /instances/{id}/delete APIs.
"d290f1ee-6c54-4b01-90e6-d701748f0851"