curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/virality/state \
--header 'api_key: <api-key>'import requests
url = "https://app.base44.com/api/apps/{app_id}/virality/state"
headers = {"api_key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {api_key: '<api-key>'}};
fetch('https://app.base44.com/api/apps/{app_id}/virality/state', 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://app.base44.com/api/apps/{app_id}/virality/state",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"api_key: <api-key>"
],
]);
$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://app.base44.com/api/apps/{app_id}/virality/state"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("api_key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.base44.com/api/apps/{app_id}/virality/state")
.header("api_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/virality/state")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["api_key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"stage": "completed",
"questions": [
{
"id": "goal",
"question": "What does success look like for this app?",
"type": "select",
"options": [
{
"label": "Get the first 100 users",
"description": "Focus on early adopters who give feedback"
}
],
"placeholder": "https://x.com/yourhandle"
}
],
"analysis_text": "A CRM for freelancers who want to track leads without a spreadsheet.",
"answers": {
"goal": "Get the first 100 users"
},
"strategy_text": "Lead with the spreadsheet pain, then show the app solving it.",
"plan": {
"id": "8c1f9a2e-3b7d-4c5e-9f01-2a3b4c5d6e7f",
"app_id": "6820f3a4e7b91d003c45a1f2",
"strategy": {
"app_summary": "A CRM for freelancers who want to track leads without a spreadsheet.",
"marketing_approach": "Lead with the spreadsheet pain, then show the app solving it.",
"platforms": [
{
"platform": "instagram",
"mode": "series",
"reasoning": "Instagram rewards a consistent series, so these build on each other.",
"posts": [
{
"id": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"platform": "instagram",
"angle": "pain_point",
"angle_label": "Pain point",
"post_number": 1,
"total_posts": 5,
"suggested_day": 1,
"rationale": "Opens on the spreadsheet frustration the audience already has.",
"content": "Still tracking leads in a spreadsheet? I built the thing I wanted instead.",
"image_url": "https://storage.base44.com/virality/3f2504e0.png",
"image_prompt": "A freelancer closing a laptop at a tidy desk, warm morning light",
"hashtags": [
"freelance",
"buildinpublic"
],
"post_title": "I built a CRM because spreadsheets kept losing my leads",
"suggested_subreddits": [
"r/freelance",
"r/SideProject"
],
"launch_comment": "Happy to answer questions about how it works.",
"option_label": "Direct and personal",
"best_for_context": "Best if your audience already knows you"
}
]
}
]
},
"created_at": "2026-08-24T09:15:00+00:00",
"updated_at": "2026-08-24T10:02:00+00:00"
},
"builder_handle": "@yourhandle",
"app_name": "Freelance CRM",
"teaser": {
"status": "ready",
"post": {
"id": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"platform": "instagram",
"angle": "pain_point",
"angle_label": "Pain point",
"post_number": 1,
"total_posts": 5,
"suggested_day": 1,
"rationale": "Opens on the spreadsheet frustration the audience already has.",
"content": "Still tracking leads in a spreadsheet? I built the thing I wanted instead.",
"image_url": "https://storage.base44.com/virality/3f2504e0.png",
"image_prompt": "A freelancer closing a laptop at a tidy desk, warm morning light",
"hashtags": [
"freelance",
"buildinpublic"
],
"post_title": "I built a CRM because spreadsheets kept losing my leads",
"suggested_subreddits": [
"r/freelance",
"r/SideProject"
],
"launch_comment": "Happy to answer questions about how it works.",
"option_label": "Direct and personal",
"best_for_context": "Best if your audience already knows you"
},
"posts": [
{
"id": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"platform": "instagram",
"angle": "pain_point",
"angle_label": "Pain point",
"post_number": 1,
"total_posts": 5,
"suggested_day": 1,
"rationale": "Opens on the spreadsheet frustration the audience already has.",
"content": "Still tracking leads in a spreadsheet? I built the thing I wanted instead.",
"image_url": "https://storage.base44.com/virality/3f2504e0.png",
"image_prompt": "A freelancer closing a laptop at a tidy desk, warm morning light",
"hashtags": [
"freelance",
"buildinpublic"
],
"post_title": "I built a CRM because spreadsheets kept losing my leads",
"suggested_subreddits": [
"r/freelance",
"r/SideProject"
],
"launch_comment": "Happy to answer questions about how it works.",
"option_label": "Direct and personal",
"best_for_context": "Best if your audience already knows you"
}
]
}
}Get social content state
Returns everything stored for the app’s social content flow: how far it has got, the questions and your answers, the current strategy, and the content plan.
Read stage to see where the app is. An app that never started the flow returns stage of idle and null for everything else, rather than a 404.
Poll this endpoint after Generate content plan returns. Only the first platform’s images are generated inline, so the rest of the image_url values appear here as they finish. A stage of generating means a plan is still being built, and the endpoints that change the plan fail with a 409 until it finishes.
This endpoint is limited to 40 requests per minute, separately from the other social content endpoints.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/virality/state \
--header 'api_key: <api-key>'import requests
url = "https://app.base44.com/api/apps/{app_id}/virality/state"
headers = {"api_key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {api_key: '<api-key>'}};
fetch('https://app.base44.com/api/apps/{app_id}/virality/state', 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://app.base44.com/api/apps/{app_id}/virality/state",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"api_key: <api-key>"
],
]);
$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://app.base44.com/api/apps/{app_id}/virality/state"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("api_key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.base44.com/api/apps/{app_id}/virality/state")
.header("api_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/virality/state")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["api_key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"stage": "completed",
"questions": [
{
"id": "goal",
"question": "What does success look like for this app?",
"type": "select",
"options": [
{
"label": "Get the first 100 users",
"description": "Focus on early adopters who give feedback"
}
],
"placeholder": "https://x.com/yourhandle"
}
],
"analysis_text": "A CRM for freelancers who want to track leads without a spreadsheet.",
"answers": {
"goal": "Get the first 100 users"
},
"strategy_text": "Lead with the spreadsheet pain, then show the app solving it.",
"plan": {
"id": "8c1f9a2e-3b7d-4c5e-9f01-2a3b4c5d6e7f",
"app_id": "6820f3a4e7b91d003c45a1f2",
"strategy": {
"app_summary": "A CRM for freelancers who want to track leads without a spreadsheet.",
"marketing_approach": "Lead with the spreadsheet pain, then show the app solving it.",
"platforms": [
{
"platform": "instagram",
"mode": "series",
"reasoning": "Instagram rewards a consistent series, so these build on each other.",
"posts": [
{
"id": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"platform": "instagram",
"angle": "pain_point",
"angle_label": "Pain point",
"post_number": 1,
"total_posts": 5,
"suggested_day": 1,
"rationale": "Opens on the spreadsheet frustration the audience already has.",
"content": "Still tracking leads in a spreadsheet? I built the thing I wanted instead.",
"image_url": "https://storage.base44.com/virality/3f2504e0.png",
"image_prompt": "A freelancer closing a laptop at a tidy desk, warm morning light",
"hashtags": [
"freelance",
"buildinpublic"
],
"post_title": "I built a CRM because spreadsheets kept losing my leads",
"suggested_subreddits": [
"r/freelance",
"r/SideProject"
],
"launch_comment": "Happy to answer questions about how it works.",
"option_label": "Direct and personal",
"best_for_context": "Best if your audience already knows you"
}
]
}
]
},
"created_at": "2026-08-24T09:15:00+00:00",
"updated_at": "2026-08-24T10:02:00+00:00"
},
"builder_handle": "@yourhandle",
"app_name": "Freelance CRM",
"teaser": {
"status": "ready",
"post": {
"id": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"platform": "instagram",
"angle": "pain_point",
"angle_label": "Pain point",
"post_number": 1,
"total_posts": 5,
"suggested_day": 1,
"rationale": "Opens on the spreadsheet frustration the audience already has.",
"content": "Still tracking leads in a spreadsheet? I built the thing I wanted instead.",
"image_url": "https://storage.base44.com/virality/3f2504e0.png",
"image_prompt": "A freelancer closing a laptop at a tidy desk, warm morning light",
"hashtags": [
"freelance",
"buildinpublic"
],
"post_title": "I built a CRM because spreadsheets kept losing my leads",
"suggested_subreddits": [
"r/freelance",
"r/SideProject"
],
"launch_comment": "Happy to answer questions about how it works.",
"option_label": "Direct and personal",
"best_for_context": "Best if your audience already knows you"
},
"posts": [
{
"id": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"platform": "instagram",
"angle": "pain_point",
"angle_label": "Pain point",
"post_number": 1,
"total_posts": 5,
"suggested_day": 1,
"rationale": "Opens on the spreadsheet frustration the audience already has.",
"content": "Still tracking leads in a spreadsheet? I built the thing I wanted instead.",
"image_url": "https://storage.base44.com/virality/3f2504e0.png",
"image_prompt": "A freelancer closing a laptop at a tidy desk, warm morning light",
"hashtags": [
"freelance",
"buildinpublic"
],
"post_title": "I built a CRM because spreadsheets kept losing my leads",
"suggested_subreddits": [
"r/freelance",
"r/SideProject"
],
"launch_comment": "Happy to answer questions about how it works.",
"option_label": "Direct and personal",
"best_for_context": "Best if your audience already knows you"
}
]
}
}Authorizations
Personal API key.
Path Parameters
ID of the app.
Response
Successful Response
The current state of an app's social content flow.
How far the app has got. The stage is idle before you start, then questions, strategy, generating, and completed once a plan exists.
idle, questions, strategy, generating, completed "completed"
Questions from Start social content flow, or null if the flow hasn't started.
Show child attributes
Show child attributes
One-sentence analysis of the app, or null if the flow hasn't started.
"A CRM for freelancers who want to track leads without a spreadsheet."
Answers you submitted, keyed by question id, or null if none were submitted.
Show child attributes
Show child attributes
{ "goal": "Get the first 100 users" }
The current content strategy, or null if none was generated.
"Lead with the spreadsheet pain, then show the app solving it."
The current content plan, or null if none was generated. Poll this to pick up images that finish generating after Generate content plan returns.
Show child attributes
Show child attributes
Social handle taken from the social_url you submitted, or null if you never sent one.
"@yourhandle"
Name of the app.
"Freelance CRM"
The standalone teaser posts, which are generated outside this flow and are not part of plan.
Show child attributes
Show child attributes
Was this page helpful?