curl --request POST \
--url https://api.autoprintfarm.com/public/v1/jobs/{id}/start \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.autoprintfarm.com/public/v1/jobs/{id}/start"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.autoprintfarm.com/public/v1/jobs/{id}/start', 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.autoprintfarm.com/public/v1/jobs/{id}/start",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
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.autoprintfarm.com/public/v1/jobs/{id}/start"
req, _ := http.NewRequest("POST", 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.post("https://api.autoprintfarm.com/public/v1/jobs/{id}/start")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.autoprintfarm.com/public/v1/jobs/{id}/start")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "<string>",
"status": "<string>",
"printer_id": "<string>",
"product_id": "<string>",
"product_sku_id": "<string>",
"product_name": "<string>",
"file_name": "<string>",
"number_of_units": 123,
"color": "<string>",
"filament_type": "<string>",
"material_type": "<string>",
"progress_percentage": 123,
"estimated_print_time_minutes": 123,
"actual_print_time_minutes": 123,
"failure_reason": "<string>",
"time_submitted": "<string>",
"time_started": "<string>",
"time_completed": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"origin": "app",
"printer_file_name": "<string>",
"filament_needed_grams": 123,
"printer_name": "<string>",
"printer_model": "<string>",
"sku_name": "<string>"
},
"timedOut": true
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}Start a queued print job
Side effect — physical motion. Streams the print file to the printer and starts the print. State transitions queued → processing atomically; reverts only when the hub definitively refuses or can’t be reached. If the command was sent but the hub’s acknowledgement was lost, the job stays processing and the response carries timedOut: true — check the printer. The job may instead be held as pending_start (200): with staggered starts on, while the farm is at its heating budget or while a held job ranks ahead of it (higher priority, or the same priority and submitted earlier); and, whatever the setting, when other prints on the farm are starting at the same moment. Held jobs start in that order as room frees. Error codes: INVALID_TRANSITION / NO_PRINTER_ASSIGNED / NO_HUB_ASSIGNED / PRINTER_UNAVAILABLE / PRINTER_MODEL_MISMATCH / PRINTER_EXCEEDS_POWER_LIMIT / OUTPUT_FORMAT_MISMATCH / FILE_EXTENSION_MISMATCH (400), NOT_FOUND / PRINTER_NOT_FOUND / FILE_NOT_FOUND / SLICE_OUTPUT_NOT_FOUND (404), JOB_STATE_CHANGED / PRINTER_BUSY / PRINTER_NEEDS_ATTENTION / FILE_PROCESSING / FILAMENT_NOT_LOADED / AMS_OVERRIDE_STALE / START_BUSY (409 — PRINTER_NEEDS_ATTENTION: the printer is waiting on someone to answer a filament prompt (pull out, push in or confirm the filament); answer it, then start again. FILE_PROCESSING: the file’s details are still being read after an upload or version change; retry shortly. START_BUSY: an override start found other prints starting; retry shortly. PRINTER_BUSY also covers a previous print on the printer that was never seen finishing: clear the bed first. AMS_OVERRIDE_STALE: the job’s AMS slots were picked by hand for an earlier version of its file; make that version current again, or recreate the job), FILE_PARSE_FAILED (422 — the file couldn’t be read and has no printer model set, or is a 3MF not known to hold sliced plates), FILE_UNSLICED (422 — the 3MF is a project with no sliced plates; slice it and upload the sliced 3MF), FILE_NOT_PRINTABLE (422 — a 3D model such as STL or OBJ; slice it first), HUB_OFFLINE / HUB_COMMAND_FAILED (503). A rejection from the dispatch gate (e.g. PLAN_LIMIT_EXCEEDED) keeps its own status and code.
curl --request POST \
--url https://api.autoprintfarm.com/public/v1/jobs/{id}/start \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.autoprintfarm.com/public/v1/jobs/{id}/start"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.autoprintfarm.com/public/v1/jobs/{id}/start', 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.autoprintfarm.com/public/v1/jobs/{id}/start",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
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.autoprintfarm.com/public/v1/jobs/{id}/start"
req, _ := http.NewRequest("POST", 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.post("https://api.autoprintfarm.com/public/v1/jobs/{id}/start")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.autoprintfarm.com/public/v1/jobs/{id}/start")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "<string>",
"status": "<string>",
"printer_id": "<string>",
"product_id": "<string>",
"product_sku_id": "<string>",
"product_name": "<string>",
"file_name": "<string>",
"number_of_units": 123,
"color": "<string>",
"filament_type": "<string>",
"material_type": "<string>",
"progress_percentage": 123,
"estimated_print_time_minutes": 123,
"actual_print_time_minutes": 123,
"failure_reason": "<string>",
"time_submitted": "<string>",
"time_started": "<string>",
"time_completed": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"origin": "app",
"printer_file_name": "<string>",
"filament_needed_grams": 123,
"printer_name": "<string>",
"printer_model": "<string>",
"sku_name": "<string>"
},
"timedOut": true
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": "<unknown>"
}
}Authorizations
API keys are minted in the AutoPrintFarm web app under Settings → API Keys. Send as Authorization: Bearer apf_live_.... Keys are shown exactly once at creation and can be revoked at any time.
Path Parameters
Response
Started — file transfer in progress (or sent but unconfirmed when timedOut is true)
true Show child attributes
Show child attributes
True when the print was sent to the hub but the hub never confirmed accepting it. The job stays processing and the hub may still start it — check the printer; live telemetry reconciles the job. False on a confirmed dispatch and when the job is held for a heating slot.
Was this page helpful?