curl --request POST \
--url https://api.michelangelo.land/v1/jobs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "prompt",
"input": {
"prompt": "<string>",
"appName": "<string>"
},
"project_id": 123
}
'import requests
url = "https://api.michelangelo.land/v1/jobs"
payload = {
"type": "prompt",
"input": {
"prompt": "<string>",
"appName": "<string>"
},
"project_id": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'prompt',
input: {prompt: '<string>', appName: '<string>'},
project_id: 123
})
};
fetch('https://api.michelangelo.land/v1/jobs', 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.michelangelo.land/v1/jobs",
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([
'type' => 'prompt',
'input' => [
'prompt' => '<string>',
'appName' => '<string>'
],
'project_id' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.michelangelo.land/v1/jobs"
payload := strings.NewReader("{\n \"type\": \"prompt\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"appName\": \"<string>\"\n },\n \"project_id\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.michelangelo.land/v1/jobs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"prompt\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"appName\": \"<string>\"\n },\n \"project_id\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.michelangelo.land/v1/jobs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"prompt\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"appName\": \"<string>\"\n },\n \"project_id\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "<string>",
"status": "queued",
"created_at": "2023-11-07T05:31:56Z",
"project_id": 123,
"result": {},
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"updated_at": "2023-11-07T05:31:56Z"
}{
"code": "<string>",
"message": "<string>",
"details": {}
}{
"code": "<string>",
"message": "<string>",
"details": {}
}{
"code": "<string>",
"message": "<string>",
"details": {}
}Create an async job
Validates the prompt with a server-side AI evaluation step, creates a job row (status: queued), dispatches the work to the managed runner and returns immediately with a job_id. The HTTP request never waits for the work itself — poll GET /jobs/{jobId} for progress.
curl --request POST \
--url https://api.michelangelo.land/v1/jobs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "prompt",
"input": {
"prompt": "<string>",
"appName": "<string>"
},
"project_id": 123
}
'import requests
url = "https://api.michelangelo.land/v1/jobs"
payload = {
"type": "prompt",
"input": {
"prompt": "<string>",
"appName": "<string>"
},
"project_id": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'prompt',
input: {prompt: '<string>', appName: '<string>'},
project_id: 123
})
};
fetch('https://api.michelangelo.land/v1/jobs', 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.michelangelo.land/v1/jobs",
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([
'type' => 'prompt',
'input' => [
'prompt' => '<string>',
'appName' => '<string>'
],
'project_id' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.michelangelo.land/v1/jobs"
payload := strings.NewReader("{\n \"type\": \"prompt\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"appName\": \"<string>\"\n },\n \"project_id\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.michelangelo.land/v1/jobs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"prompt\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"appName\": \"<string>\"\n },\n \"project_id\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.michelangelo.land/v1/jobs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"prompt\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"appName\": \"<string>\"\n },\n \"project_id\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "<string>",
"status": "queued",
"created_at": "2023-11-07T05:31:56Z",
"project_id": 123,
"result": {},
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"updated_at": "2023-11-07T05:31:56Z"
}{
"code": "<string>",
"message": "<string>",
"details": {}
}{
"code": "<string>",
"message": "<string>",
"details": {}
}{
"code": "<string>",
"message": "<string>",
"details": {}
}Authorizations
OAuth 2.1 authorization code flow with PKCE, issued by the Michelangelo identity provider. Third-party clients register via Dynamic Client Registration — see the Authentication guide for the full flow.
Body
Job kind. Only prompt in v0.1; grows with the runner catalog
prompt Job-specific payload (e.g. the prompt text and options). model and appName are optional: when omitted the API evaluates the prompt server-side and fills them in before the runner picks up the job.
Show child attributes
Show child attributes
Numeric project id (matches public.projects.id)
Response
Job accepted and queued
queued, running, succeeded, failed, canceled Numeric project id (matches public.projects.id), nullable
Output payload on success — contains project_id and files_saved
Show child attributes
Show child attributes
Was this page helpful?

