curl --request POST \
--url https://preuve.ai/api/agent/tools/idea-generator \
--header 'Content-Type: application/json' \
--header 'x-preuve-key: <api-key>' \
--data '
{
"interests": "<string>",
"budget": "<string>",
"audience": "<string>",
"industry": "<string>",
"language": "<string>",
"pro": true,
"fit": true
}
'import requests
url = "https://preuve.ai/api/agent/tools/idea-generator"
payload = {
"interests": "<string>",
"budget": "<string>",
"audience": "<string>",
"industry": "<string>",
"language": "<string>",
"pro": True,
"fit": True
}
headers = {
"x-preuve-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-preuve-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
interests: '<string>',
budget: '<string>',
audience: '<string>',
industry: '<string>',
language: '<string>',
pro: true,
fit: true
})
};
fetch('https://preuve.ai/api/agent/tools/idea-generator', 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://preuve.ai/api/agent/tools/idea-generator",
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([
'interests' => '<string>',
'budget' => '<string>',
'audience' => '<string>',
'industry' => '<string>',
'language' => '<string>',
'pro' => true,
'fit' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-preuve-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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://preuve.ai/api/agent/tools/idea-generator"
payload := strings.NewReader("{\n \"interests\": \"<string>\",\n \"budget\": \"<string>\",\n \"audience\": \"<string>\",\n \"industry\": \"<string>\",\n \"language\": \"<string>\",\n \"pro\": true,\n \"fit\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-preuve-key", "<api-key>")
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://preuve.ai/api/agent/tools/idea-generator")
.header("x-preuve-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"interests\": \"<string>\",\n \"budget\": \"<string>\",\n \"audience\": \"<string>\",\n \"industry\": \"<string>\",\n \"language\": \"<string>\",\n \"pro\": true,\n \"fit\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://preuve.ai/api/agent/tools/idea-generator")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-preuve-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"interests\": \"<string>\",\n \"budget\": \"<string>\",\n \"audience\": \"<string>\",\n \"industry\": \"<string>\",\n \"language\": \"<string>\",\n \"pro\": true,\n \"fit\": true\n}"
response = http.request(request)
puts response.read_body{
"ideas": [
{
"name": "<string>",
"pitch": "<string>",
"whyNow": "<string>",
"saturation": "LOW",
"audience": "B2B",
"tags": [
"<string>"
],
"sources": [
"<string>"
],
"painPoint": "<string>",
"painPointLocked": true
}
],
"remaining": 123,
"limit": 123,
"pro": true,
"fit": true,
"fitReason": "applied",
"fitHint": "<string>"
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}Generate startup ideas
Synchronous idea generation - the backing route for the generate_ideas MCP tool. Spends no scan quota or tokens. Free accounts get 5 generations per rolling 24 hours per account (GENERATION_LIMIT when exhausted). Paid-or-credited accounts skip that cap and get limit: null, under a daily fair-use ceiling of 20 generations per rolling 24 hours per account, 15 of them with the Pro model (a Pro run counts toward both), shared with the idea generator on preuve.ai and refused with DAILY_LIMIT_REACHED. The Pro model is the default on paid plans (pro: false opts out) and the response pro says whether the Pro tier was used (under load a Pro-tier run can be served by a faster fallback model); pro: true without a paid plan is refused with PRO_PAID_REQUIRED, and a pro that is not a boolean or null is 400 INVALID_INPUT. Founder-profile tailoring is automatic on paid plans with a saved profile (fit: false opts out); the response’s fitReason and fitHint state why tailoring did or did not apply.
curl --request POST \
--url https://preuve.ai/api/agent/tools/idea-generator \
--header 'Content-Type: application/json' \
--header 'x-preuve-key: <api-key>' \
--data '
{
"interests": "<string>",
"budget": "<string>",
"audience": "<string>",
"industry": "<string>",
"language": "<string>",
"pro": true,
"fit": true
}
'import requests
url = "https://preuve.ai/api/agent/tools/idea-generator"
payload = {
"interests": "<string>",
"budget": "<string>",
"audience": "<string>",
"industry": "<string>",
"language": "<string>",
"pro": True,
"fit": True
}
headers = {
"x-preuve-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-preuve-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
interests: '<string>',
budget: '<string>',
audience: '<string>',
industry: '<string>',
language: '<string>',
pro: true,
fit: true
})
};
fetch('https://preuve.ai/api/agent/tools/idea-generator', 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://preuve.ai/api/agent/tools/idea-generator",
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([
'interests' => '<string>',
'budget' => '<string>',
'audience' => '<string>',
'industry' => '<string>',
'language' => '<string>',
'pro' => true,
'fit' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-preuve-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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://preuve.ai/api/agent/tools/idea-generator"
payload := strings.NewReader("{\n \"interests\": \"<string>\",\n \"budget\": \"<string>\",\n \"audience\": \"<string>\",\n \"industry\": \"<string>\",\n \"language\": \"<string>\",\n \"pro\": true,\n \"fit\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-preuve-key", "<api-key>")
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://preuve.ai/api/agent/tools/idea-generator")
.header("x-preuve-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"interests\": \"<string>\",\n \"budget\": \"<string>\",\n \"audience\": \"<string>\",\n \"industry\": \"<string>\",\n \"language\": \"<string>\",\n \"pro\": true,\n \"fit\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://preuve.ai/api/agent/tools/idea-generator")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-preuve-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"interests\": \"<string>\",\n \"budget\": \"<string>\",\n \"audience\": \"<string>\",\n \"industry\": \"<string>\",\n \"language\": \"<string>\",\n \"pro\": true,\n \"fit\": true\n}"
response = http.request(request)
puts response.read_body{
"ideas": [
{
"name": "<string>",
"pitch": "<string>",
"whyNow": "<string>",
"saturation": "LOW",
"audience": "B2B",
"tags": [
"<string>"
],
"sources": [
"<string>"
],
"painPoint": "<string>",
"painPointLocked": true
}
],
"remaining": 123,
"limit": 123,
"pro": true,
"fit": true,
"fitReason": "applied",
"fitHint": "<string>"
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"remaining": 123,
"resetAt": "2023-11-07T05:31:56Z",
"tokenBalance": 123,
"scansUsed": 123,
"scansRemaining": 123,
"limitType": "<string>",
"upgradeHint": "<string>",
"paused": true,
"upsell": {
"offer": "founder_report",
"price": "<string>",
"guarantee": "<string>",
"url": "<string>",
"locked": [
"<string>"
],
"note": "<string>"
}
}Authorizations
Your API key (prv_...), sent as-is. It is the only credential the API needs - see the Authentication guide.
Body
Interests or skills to generate ideas from.
3 - 50010010010010Use the Pro model. Defaults to true on paid plans and false otherwise (null counts as omitted); true without a paid plan is refused.
Founder-profile tailoring is automatic on paid plans with a saved profile; pass false to opt out. Passing true is never needed.
Response
Generated ideas. remaining and limit are null for paid-or-credited accounts, whose daily ceiling is not counted down here; free accounts see the rolling-24h window state. Pain points are teased as locked on non-paid plans.
5Show child attributes
Show child attributes
applied, disabled, requires_paid_plan, no_profile Present when tailoring did not apply for a reason worth relaying to the user (no_profile, requires_paid_plan).