curl --request POST \
--url https://{subdomain}.mihu.ai/api/v1/builder-agents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "Watch my CRM for new leads every 5 minutes and expose them",
"name": "<string>",
"auto_approve": false,
"skip_qa": false
}
'import requests
url = "https://{subdomain}.mihu.ai/api/v1/builder-agents"
payload = {
"prompt": "Watch my CRM for new leads every 5 minutes and expose them",
"name": "<string>",
"auto_approve": False,
"skip_qa": False
}
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({
prompt: 'Watch my CRM for new leads every 5 minutes and expose them',
name: '<string>',
auto_approve: false,
skip_qa: false
})
};
fetch('https://{subdomain}.mihu.ai/api/v1/builder-agents', 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://{subdomain}.mihu.ai/api/v1/builder-agents",
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([
'prompt' => 'Watch my CRM for new leads every 5 minutes and expose them',
'name' => '<string>',
'auto_approve' => false,
'skip_qa' => false
]),
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://{subdomain}.mihu.ai/api/v1/builder-agents"
payload := strings.NewReader("{\n \"prompt\": \"Watch my CRM for new leads every 5 minutes and expose them\",\n \"name\": \"<string>\",\n \"auto_approve\": false,\n \"skip_qa\": false\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://{subdomain}.mihu.ai/api/v1/builder-agents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"Watch my CRM for new leads every 5 minutes and expose them\",\n \"name\": \"<string>\",\n \"auto_approve\": false,\n \"skip_qa\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{subdomain}.mihu.ai/api/v1/builder-agents")
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 \"prompt\": \"Watch my CRM for new leads every 5 minutes and expose them\",\n \"name\": \"<string>\",\n \"auto_approve\": false,\n \"skip_qa\": false\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "lead-watcher",
"status": "processing",
"prompt": "<string>",
"message": "<string>",
"questions": [
"<string>"
],
"builder": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "lead-watcher",
"kind": "codebase",
"status": "deploying",
"preview_url": "<string>",
"service_token": "<string>",
"entrypoint": "python3 main.py",
"port": 8000,
"job_type": "always_on",
"auto_stop_interval": 0,
"backup_interval_hours": 0,
"review_passed": true,
"qa_passed": true,
"cost": {
"currency": "EUR",
"hourly_rate": 0.1965,
"runtime_hours": 1.5,
"cost": 0.29,
"billing": "accruing"
},
"created_at": "2023-11-07T05:31:56Z"
},
"created_at": "2023-11-07T05:31:56Z"
}
}Start a build conversation
Describe what you want in one sentence and the AI builder takes it from there. This is the entry point of an asynchronous, multi-turn conversation.
How it works (the full loop):
POST /api/v1/builder-agentswith yourprompt. It returns immediately withstatus: processingand auuid— the build does not run inline (that would exceed request timeouts), it runs in the background.- Poll
GET /api/v1/builder-agents/{uuid}every ~2-3 seconds. While the builder is thinking it staysprocessing; keep polling. - When it needs input the status becomes
gathering: readmessage(what it’s asking) andquestions(the list to answer). Typical questions: which credentials to use, region/fields, VM size, one-time vs always-on, backup frequency. - Reply with
POST /api/v1/builder-agents/{uuid}/answers(a singlemessage). That call also returnsprocessing— poll again (step 2). The loop repeats until the builder has everything. - The conversation ends in one of two terminal states:
deployed— the app was generated and is running. Thebuilderfield holds the live builder (withpreview_url). Operate it via the /api/v1/builders endpoints.failed— generation could not complete. Start a new conversation with an adjusted prompt.
When it ‘works’: a simple agent is usually deployed after 1-2 question rounds; each round is a few seconds of processing, plus ~1 minute for the final deploy. There is no fixed limit on rounds — keep answering until terminal.
Example: prompt ‘Watch my Zoho CRM leads every 5 minutes’ → processing → gathering (‘Use stored Zoho credentials or paste new ones? Which region?’) → answer → processing → deployed with a preview URL.
curl --request POST \
--url https://{subdomain}.mihu.ai/api/v1/builder-agents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "Watch my CRM for new leads every 5 minutes and expose them",
"name": "<string>",
"auto_approve": false,
"skip_qa": false
}
'import requests
url = "https://{subdomain}.mihu.ai/api/v1/builder-agents"
payload = {
"prompt": "Watch my CRM for new leads every 5 minutes and expose them",
"name": "<string>",
"auto_approve": False,
"skip_qa": False
}
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({
prompt: 'Watch my CRM for new leads every 5 minutes and expose them',
name: '<string>',
auto_approve: false,
skip_qa: false
})
};
fetch('https://{subdomain}.mihu.ai/api/v1/builder-agents', 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://{subdomain}.mihu.ai/api/v1/builder-agents",
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([
'prompt' => 'Watch my CRM for new leads every 5 minutes and expose them',
'name' => '<string>',
'auto_approve' => false,
'skip_qa' => false
]),
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://{subdomain}.mihu.ai/api/v1/builder-agents"
payload := strings.NewReader("{\n \"prompt\": \"Watch my CRM for new leads every 5 minutes and expose them\",\n \"name\": \"<string>\",\n \"auto_approve\": false,\n \"skip_qa\": false\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://{subdomain}.mihu.ai/api/v1/builder-agents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"Watch my CRM for new leads every 5 minutes and expose them\",\n \"name\": \"<string>\",\n \"auto_approve\": false,\n \"skip_qa\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{subdomain}.mihu.ai/api/v1/builder-agents")
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 \"prompt\": \"Watch my CRM for new leads every 5 minutes and expose them\",\n \"name\": \"<string>\",\n \"auto_approve\": false,\n \"skip_qa\": false\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "lead-watcher",
"status": "processing",
"prompt": "<string>",
"message": "<string>",
"questions": [
"<string>"
],
"builder": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "lead-watcher",
"kind": "codebase",
"status": "deploying",
"preview_url": "<string>",
"service_token": "<string>",
"entrypoint": "python3 main.py",
"port": 8000,
"job_type": "always_on",
"auto_stop_interval": 0,
"backup_interval_hours": 0,
"review_passed": true,
"qa_passed": true,
"cost": {
"currency": "EUR",
"hourly_rate": 0.1965,
"runtime_hours": 1.5,
"cost": 0.29,
"billing": "accruing"
},
"created_at": "2023-11-07T05:31:56Z"
},
"created_at": "2023-11-07T05:31:56Z"
}
}Authorizations
Use a Bearer token to access these API endpoints. Example: "Bearer {your-token}"
Body
"Watch my CRM for new leads every 5 minutes and expose them"
Optional name. Auto-derived from the prompt if omitted.
Skip the one-time approval gate and build immediately (for automation).
false
Deploy without the pre-deploy review and post-deploy QA (faster, unverified). Self-heal still runs.
false