curl --request POST \
--url https://dally.ai/v1/onboarding.take \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"ask": "hook"
}'import requests
url = "https://dally.ai/v1/onboarding.take"
payload = { "ask": "hook" }
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({ask: 'hook'})
};
fetch('https://dally.ai/v1/onboarding.take', 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://dally.ai/v1/onboarding.take",
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([
'ask' => 'hook'
]),
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://dally.ai/v1/onboarding.take"
payload := strings.NewReader("{\n \"ask\": \"hook\"\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://dally.ai/v1/onboarding.take")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ask\": \"hook\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://dally.ai/v1/onboarding.take")
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 \"ask\": \"hook\"\n}"
response = http.request(request)
puts response.read_body{
"taken": true,
"onboarding": {
"step": "profile_audit",
"done": false,
"skip": {
"operation": "onboarding.skip",
"follow_up": "I already know how to use Dally"
}
},
"show": {
"kind": "onboarding_canvas",
"data": {}
},
"request_id": "req_01j8zkq"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
},
"request_id": "<string>"
}onboarding.take
Access: public. Send a JSON body; unknown keys are rejected with 400 invalid_request (inputs are strict). Responses may gain fields additively — never remove or repurpose; ignore unknown response fields.
curl --request POST \
--url https://dally.ai/v1/onboarding.take \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"ask": "hook"
}'import requests
url = "https://dally.ai/v1/onboarding.take"
payload = { "ask": "hook" }
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({ask: 'hook'})
};
fetch('https://dally.ai/v1/onboarding.take', 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://dally.ai/v1/onboarding.take",
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([
'ask' => 'hook'
]),
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://dally.ai/v1/onboarding.take"
payload := strings.NewReader("{\n \"ask\": \"hook\"\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://dally.ai/v1/onboarding.take")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ask\": \"hook\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://dally.ai/v1/onboarding.take")
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 \"ask\": \"hook\"\n}"
response = http.request(request)
puts response.read_body{
"taken": true,
"onboarding": {
"step": "profile_audit",
"done": false,
"skip": {
"operation": "onboarding.skip",
"follow_up": "I already know how to use Dally"
}
},
"show": {
"kind": "onboarding_canvas",
"data": {}
},
"request_id": "req_01j8zkq"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
},
"request_id": "<string>"
}Authorizations
A WorkOS-dashboard-issued internal API key on Authorization: Bearer.
Body
The id of the ask the tapped button carries.
^[a-z][a-z0-9_]{0,63}$Response
Success. request_id is present on every response.
Whether this call recorded the take; false when the ask was already taken or the way in had ended.
This room's place on the way in, as data, on every answer while it is open. step is the last step this room reached, null before its first card; done and ended_by say whether and how it ended (skip, question or done). While next is present, render next.card through dally_show, saying say first, as written, when it is present. After the onboarding_canvas card the way in runs itself: the card's buttons record their own progress, so answer the creator as usual; before that card, a real question ends the way in. skip names the write that ends the way in, onboarding.skip, and follow_up the line a creator who already knows Dally says; when they say it, call onboarding.skip.
Show child attributes
Show child attributes
How it is shown: the onboarding canvas, which reads its own count.
Show child attributes
Show child attributes
Server-minted id for this request. Present on every response, success and error — quote it when reporting a problem.
1