Get a template
curl --request GET \
--url https://api.craftkit.dev/v1/templates/{slug} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.craftkit.dev/v1/templates/{slug}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.craftkit.dev/v1/templates/{slug}', 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.craftkit.dev/v1/templates/{slug}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.craftkit.dev/v1/templates/{slug}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.craftkit.dev/v1/templates/{slug}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.craftkit.dev/v1/templates/{slug}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "7c9f0b2e-2b1a-4f3d-9c8e-1a2b3c4d5e6f",
"name": "Invoice",
"slug": "invoice",
"description": "Standard customer invoice",
"templateType": "document",
"currentVersionNumber": 3,
"published": true,
"manifest": {
"variables": [
{
"key": "customer.name",
"label": "Customer name",
"dataType": "text",
"required": true
}
],
"loops": []
},
"jsonSchema": {
"type": "object"
},
"createdAt": "2026-06-01T09:00:00.000Z",
"updatedAt": "2026-06-20T14:30:00.000Z"
}{
"error": {
"code": "unauthorized",
"message": "Missing Bearer token."
}
}{
"error": {
"code": "template_not_found",
"message": "No template 'invoice' in this project."
}
}Templates
Get a template
Fetch a single template’s metadata, its published variable manifest, and
the auto-generated JSON Schema for client-side validation. Returns
manifest: null / published: false when the template exists but has no
published version (distinct from a 404).
GET
/
v1
/
templates
/
{slug}
Get a template
curl --request GET \
--url https://api.craftkit.dev/v1/templates/{slug} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.craftkit.dev/v1/templates/{slug}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.craftkit.dev/v1/templates/{slug}', 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.craftkit.dev/v1/templates/{slug}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.craftkit.dev/v1/templates/{slug}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.craftkit.dev/v1/templates/{slug}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.craftkit.dev/v1/templates/{slug}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "7c9f0b2e-2b1a-4f3d-9c8e-1a2b3c4d5e6f",
"name": "Invoice",
"slug": "invoice",
"description": "Standard customer invoice",
"templateType": "document",
"currentVersionNumber": 3,
"published": true,
"manifest": {
"variables": [
{
"key": "customer.name",
"label": "Customer name",
"dataType": "text",
"required": true
}
],
"loops": []
},
"jsonSchema": {
"type": "object"
},
"createdAt": "2026-06-01T09:00:00.000Z",
"updatedAt": "2026-06-20T14:30:00.000Z"
}{
"error": {
"code": "unauthorized",
"message": "Missing Bearer token."
}
}{
"error": {
"code": "template_not_found",
"message": "No template 'invoice' in this project."
}
}Authorizations
Project API key (ck_live_… or ck_test_…) presented as a bearer token.
For embed partner endpoints this is the partner secret key, which is the
same credential type.
Path Parameters
The template slug (canonical identifier within the project).
Response
The template.
Show child attributes
Show child attributes