Panels API
Créez et gérez des panels IA pour interroger des groupes de minds avec agrégation structurée des réponses.
Les panels vous permettent d'interroger des groupes de minds IA avec des questions et de recevoir des réponses agrégées et structurées. Idéal pour les simulations d'études de marché, la collecte de feedback par persona et l'analyse multi-perspectives.
URL de base : https://getminds.ai/api/v1 ou https://api.getminds.ai/v1
Concepts
| Concept | Description |
|---|---|
| Panel | Un conteneur pour interroger plusieurs Mind Group avec des questions |
| Mind Group | Un ensemble de minds qui répondent ensemble (ex. : "Gen Z Users", "Senior Developers") |
| Question | Une invite envoyée à tous les minds des groupes du panel |
| Aggregated Response | Réponses classifiées et regroupées par IA avec des valeurs scalaires ou catégorielles |
Lister les panels
Récupère tous les panels appartenant à l'utilisateur authentifié.
Endpoint : GET /api/v1/panels
Headers :
Authorization: Bearer minds_your_api_key
Réponse
{
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Consumer Research Panel",
"flowMode": "panel",
"createdAt": "2025-12-10T12:00:00.000Z",
"updatedAt": "2025-12-10T14:30:00.000Z",
"messageCount": 8,
"groups": [
{
"id": "group-123",
"name": "Gen Z Consumers",
"sparkCount": 5,
"sparks": [
{
"id": "spark-1",
"name": "Emma",
"discipline": "College Student",
"profileImageUrl": "https://..."
}
]
}
]
}
]
}
Champs de la réponse
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant unique du panel |
name | string | Nom du panel |
flowMode | string | Toujours "panel" pour les flows de type panel |
createdAt | string | Horodatage de création ISO 8601 |
updatedAt | string | Horodatage de dernière mise à jour ISO 8601 |
messageCount | number | Nombre total de messages (questions + réponses) |
groups | array | Mind Group attachés à ce panel |
groups[].sparkCount | number | Nombre de minds dans le groupe |
Exemple de requête
curl -X GET "https://getminds.ai/api/v1/panels" \
-H "Authorization: Bearer minds_your_api_key"
Créer un panel
Crée un nouveau panel avec des Mind Group optionnels attachés.
Endpoint : POST /api/v1/panels
Headers :
Authorization: Bearer minds_your_api_key
Content-Type: application/json
Corps de la requête
{
"name": "Product Feedback Panel",
"groupIds": ["group-123", "group-456"]
}
Paramètres
| Paramètre | Type | Requis | Description |
|---|---|---|---|
name | string | Oui | Nom du panel |
groupIds | array | Non | Tableau d'identifiants de Mind Group à attacher au panel |
Réponse
{
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Product Feedback Panel",
"flowMode": "panel",
"createdAt": "2025-12-10T12:00:00.000Z",
"groups": [
{
"id": "group-123",
"name": "Early Adopters",
"sparks": [
{
"id": "spark-1",
"name": "Alex",
"discipline": "Tech Enthusiast",
"profileImageUrl": "https://..."
}
]
}
]
}
}
Exemple de requête
curl -X POST "https://getminds.ai/api/v1/panels" \
-H "Authorization: Bearer minds_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Market Research Panel",
"groupIds": ["group-123", "group-456"]
}'
Réponses d'erreur
400 Bad Request - Nom manquant ou identifiants de groupe invalides
{
"statusCode": 400,
"message": "name is required"
}
{
"statusCode": 404,
"message": "Groups not found: 1f2e3d4c-..."
}
Obtenir les détails d'un panel
Récupère un panel spécifique avec tous ses groupes et l'historique des messages.
Endpoint : GET /api/v1/panels/{panelId}
Headers :
Authorization: Bearer minds_your_api_key
Réponse
{
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Consumer Research Panel",
"flowMode": "panel",
"createdAt": "2025-12-10T12:00:00.000Z",
"updatedAt": "2025-12-10T14:30:00.000Z",
"groups": [
{
"id": "group-123",
"name": "Gen Z Consumers",
"sparks": [
{
"id": "spark-1",
"name": "Emma",
"discipline": "College Student",
"profileImageUrl": "https://..."
}
]
}
],
"messages": [
{
"id": "msg-1",
"role": "user",
"content": "How important is sustainability when choosing products?",
"metadata": {
"groupIds": ["group-123"]
},
"createdAt": "2025-12-10T14:00:00.000Z"
},
{
"id": "msg-2",
"role": "assistant",
"content": "How important is sustainability when choosing products?",
"metadata": {
"outputData": {
"title": "How important is sustainability when choosing products?",
"type": "scale",
"groups": [
{
"group": "Gen Z Consumers",
"value": "Very Important",
"answers": [
{
"value": "9/10",
"persona": "Emma",
"discipline": "College Student",
"message": "Sustainability is a top priority for me..."
}
]
}
]
},
"outputType": "bar"
},
"createdAt": "2025-12-10T14:00:30.000Z"
}
]
}
}
Exemple de requête
curl -X GET "https://getminds.ai/api/v1/panels/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer minds_your_api_key"
Réponses d'erreur
403 Forbidden - Accès non autorisé à ce panel
404 Not Found - Le panel n'existe pas
Poser une question au panel
Envoie une question à tous les minds du panel et reçoit des réponses en streaming avec les résultats agrégés.
Endpoint : POST /api/v1/panels/{panelId}/ask
Headers :
Authorization: Bearer minds_your_api_key
Content-Type: application/json
Corps de la requête
Question simple :
{
"question": "What features would make you switch to a competitor product?",
"groupIds": ["group-123"]
}
Avec pièces jointes :
{
"question": "Please review this product design and provide feedback",
"attachments": [
{
"url": "https://example.com/design.pdf",
"name": "Product Design v2",
"type": "application/pdf"
},
{
"path": "uploads/mockup.png",
"name": "UI Mockup"
}
],
"links": [
{
"label": "https://competitor.com/product",
"id": "link-1"
}
],
"keywords": [
{
"label": "sustainable packaging",
"url": "https://example.com/article",
"id": "keyword-1"
}
]
}
Paramètres
| Paramètre | Type | Requis | Description |
|---|---|---|---|
question | string | Oui | La question à poser à tous les minds du panel |
groupIds | array | Non | Limite la question à des groupes spécifiques (par défaut : tous les groupes) |
attachments | array | Non | Pièces jointes (PDFs, images, documents) pour fournir du contexte. Voir pièces jointes ci-dessous. |
links | array | Non | URLs à récupérer et analyser (utilise Firecrawl pour les sites JS-heavy). Chaque entrée a un label (URL) et un id optionnel. |
keywords | array | Non | Mots-clés avec URLs associées pour le contexte. Chaque entrée a un label (mot-clé), une url (source) et un id optionnel. |
model | string | Non | Remplace le modèle IA utilisé pour les réponses des panélistes. Doit être envoyé avec provider. Voir remplacement de modèle ci-dessous. |
provider | string | Non | Fournisseur IA pour le remplacement de modèle : openai, anthropic ou google. Doit être envoyé avec model. |
disableDiversityCheck | boolean | Non | Si true, désactive la boucle de régénération avec contrôle de diversité (auto-similarité bigramme, homogénéité des valeurs, remplissage des buckets vides). Réservé aux runs d'ablation et de benchmark où la couche d'orchestration est la variable testée. Par défaut : false. |
Réponse (Server-Sent Events)
L'endpoint retourne un flux de Server-Sent Events (SSE). Chaque événement est un objet JSON avec un champ type.
Classification de la question
Avant le traitement, le système classifie automatiquement votre question dans l'un des trois types suivants :
| Type | Description | Exemples de questions |
|---|---|---|
scale | Notes numériques (1-5, 1-10, etc.) | "Notez ceci de 1 à 5", "Score de 0 à 10" |
categorical | Choix discrets (oui/non, A/B/C) | "Êtes-vous d'accord ?", "Lequel préférez-vous : A, B ou C ?" |
qualitative | Opinions ouvertes | "Qu'en pensez-vous ?", "Quelles sont vos préoccupations ?" |
Pour les questions qualitatives, les réponses sont automatiquement regroupées par thèmes (ex. : "Préoccupations liées à la vie privée", "Freins liés au coût"). Le champ value de chaque réponse contient le thème attribué.
Types d'événements
1. Événement Start
{"type": "start", "total": 10}
Indique le début du traitement avec le nombre total de minds.
2. Événement Classification
{
"type": "classification",
"classification": {
"type": "scale",
"scaleRange": [1, 5]
}
}
Indique comment la question a été classifiée. Pour les questions de type scale, inclut la plage détectée. Pour les questions catégorielles, inclut les options détectées.
3. Événement Answer
{
"type": "answer",
"sparkId": "spark-1",
"sparkName": "Emma",
"discipline": "College Student",
"profileImageUrl": "https://...",
"groupId": "group-123",
"groupName": "Gen Z Consumers",
"answer": "4\n\nI think this is a solid product but could improve..."
}
Envoyé pour la réponse individuelle de chaque mind. Pour les questions scale/catégorielles, la réponse commence par la note ou le choix, suivi du raisonnement.
4. Événement Aggregating
{"type": "aggregating"}
Indique que l'IA agrège maintenant toutes les réponses. Pour les questions qualitatives, cela inclut le regroupement par thèmes.
5. Événement Result
{
"type": "result",
"outputData": {
"title": "What features would make you switch to a competitor product?",
"type": "categorical",
"classification": {
"type": "categorical",
"options": ["Yes", "No", "Maybe"]
},
"groups": [
{
"group": "Gen Z Consumers",
"value": "Better Price",
"alignmentScore": 82,
"answers": [
{
"value": "Price",
"persona": "Emma",
"discipline": "College Student",
"message": "I would switch if a competitor offered better pricing...",
"imageUrl": "https://...",
"reliabilityScore": 84
}
]
}
]
},
"outputType": "bar"
}
Contient les résultats agrégés avec les réponses classifiées. alignmentScore et reliabilityScore par réponse sont calculés avant que le résultat soit retourné sur les endpoints v1 (voir Alignment scoring).
6. Événement Done
{"type": "done"}
Indique que le flux est terminé.
Structure des données de sortie
| Champ | Type | Description |
|---|---|---|
title | string | La question d'origine |
type | string | Type de réponse : "scale", "categorical" ou "qualitative" |
classification | object | Détails de la classification (type, scaleRange ou options) |
groups | array | Réponses agrégées par Spark Group |
groups[].group | string | Nom du groupe |
groups[].value | string | Valeur dominante pour le groupe (moyenne pour scale, valeur la plus fréquente pour categorical, thème dominant pour qualitative) |
groups[].alignmentScore | number? | Moyenne des reliabilityScore par réponse pour le groupe (0-100). Voir Alignment scoring. Omis si aucune réponse du groupe n'a pu être scorée. |
groups[].answers | array | Réponses individuelles des minds |
groups[].answers[].value | string | Valeur extraite : nombre pour scale, choix pour categorical, thème pour qualitative |
groups[].answers[].persona | string | Nom du Spark |
groups[].answers[].discipline | string | Discipline/rôle du Spark |
groups[].answers[].message | string | Texte complet de la réponse (raisonnement pour scale/categorical, réponse complète pour qualitative) |
groups[].answers[].imageUrl | string | URL de l'image de profil du Spark |
groups[].answers[].reliabilityScore | number? | Score de fiabilité par mind (0-100) : mesure dans quelle mesure la réponse de ce mind est cohérente avec la définition de son propre persona. Voir Alignment scoring. Omis si l'évaluateur a été ignoré (systemPrompt court, message vide) ou a échoué. |
Types de réponses expliqués
Réponses scale :
value: La note numérique (ex. : "4")message: Bref raisonnement justifiant la notegroups[].value: Note moyenne du groupe
Réponses catégorielles :
value: L'option choisie (ex. : "Yes", "Option A")message: Bref raisonnement justifiant le choixgroups[].value: Choix le plus fréquent dans le groupe
Réponses qualitatives :
value: Thème attribué (ex. : "Privacy concerns", "Cost barriers")message: Texte complet de la réponsegroups[].value: Thème dominant dans le groupe- Les thèmes sont automatiquement regroupés à partir de toutes les réponses (3 à 6 thèmes identifiés)
Alignment scoring
Chaque réponse de panel inclut deux scores dans la réponse de l'API v1 :
groups[].answers[].reliabilityScore(0-100, entier, optionnel) : score par mind mesurant dans quelle mesure la réponse est cohérente avec le persona du mind, évaluée par rapport à son propresystemPrompt. Calculé en réévaluant la réponse avec le même évaluateur que pour les chats individuels, ce qui rend la valeur v1 du panel directement comparable aux valeursreliabilityScored'un mind seul.groups[].alignmentScore(0-100, entier, optionnel) : moyenne desreliabilityScorepar réponse pour ce groupe. L'interface l'affiche comme indicateur Alignment par groupe (High / Medium / Low).
Bandes de labels utilisées par l'interface (absentes du payload, incluses ici pour que les consommateurs de l'API puissent les reproduire) :
| Bande | Plage |
|---|---|
| High | 67-100 |
| Medium | 34-66 |
| Low | 0-33 |
Quand les champs sont omis : l'évaluateur ignore les réponses dont le systemPrompt du mind fait moins de 20 caractères, dont le message de réponse est vide, ou lorsque l'appel à l'évaluateur échoue. Si toutes les réponses d'un groupe sont ignorées, l'alignmentScore de ce groupe est également omis.
Timing : sur les endpoints v1, le scoring s'exécute de façon synchrone avant que la réponse soit retournée. Les scores sont donc présents dans le même payload que le reste de outputData. Cela ajoute quelques secondes de latence en plus de la génération du panel. Les consommateurs qui ont besoin d'un résultat de panel plus rapide sans alignment peuvent évaluer en batch en aval plutôt que de s'appuyer sur le score inline.
Statut : il s'agit d'un substitut temporaire à une future métrique d'alignement de groupe (proximité avec les résultats de recherche empiriques). Les noms de champs seront préservés lors de cette évolution ; la sémantique de alignmentScore pourra changer.
File Attachments
Vous pouvez joindre des fichiers, des liens et des mots-clés pour fournir du contexte aux questions du panel. Les minds recevront le contenu traité avant de répondre.
Types de pièces jointes
1. Pièces jointes fichiers (attachments)
Importez des documents, PDFs, images et tableurs pour analyse :
{
"question": "What improvements would you suggest for this product spec?",
"attachments": [
{
"url": "https://example.com/product-spec.pdf",
"name": "Product Specification v2.1",
"type": "application/pdf"
},
{
"path": "uploads/user-research.docx",
"name": "User Research Findings"
}
]
}
Formats supportés :
- Documents : PDF, DOCX, TXT, MD
- Images : PNG, JPG, WEBP (avec OCR)
- Tableurs : CSV, XLSX
Sources de fichiers :
url: URL externe (téléchargée et traitée)path: Chemin de stockage Supabase (signé et traité automatiquement)
2. Pièces jointes liens (links)
Récupère et analyse des pages web (utilise Firecrawl pour les sites JS-heavy + captures d'écran) :
{
"question": "Compare our pricing to these competitors",
"links": [
{ "label": "https://competitor-a.com/pricing", "id": "link-1" },
{ "label": "https://competitor-b.com/pricing", "id": "link-2" }
]
}
Fonctionnalités :
- Rendu JavaScript (Firecrawl)
- Capture d'écran pour le contexte visuel
- Extraction Markdown
- Troncature automatique du contenu (3000 caractères par lien si plusieurs, 15000 si un seul)
3. Contexte par mots-clés (keywords)
Fournissez des mots-clés avec des URLs sources pour du contexte supplémentaire :
{
"question": "How can we improve sustainability?",
"keywords": [
{
"label": "circular economy",
"url": "https://en.wikipedia.org/wiki/Circular_economy",
"id": "kw-1"
},
{
"label": "carbon neutral packaging",
"url": "https://example.com/carbon-neutral-guide",
"id": "kw-2"
}
]
}
Exemple complet avec pièces jointes
curl -X POST "https://getminds.ai/api/v1/panels/panel-id/ask" \
-H "Authorization: Bearer minds_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"question": "Based on this product design and competitor analysis, what features should we prioritize?",
"groupIds": ["product-managers", "designers"],
"attachments": [
{
"url": "https://example.com/product-design-v3.pdf",
"name": "Product Design v3",
"type": "application/pdf"
}
],
"links": [
{ "label": "https://competitor.com/features" }
],
"keywords": [
{
"label": "user experience best practices",
"url": "https://uxdesign.com/best-practices"
}
]
}'
Traitement :
- Les fichiers sont analysés en parallèle (PDFs : extraction de texte, images : OCR/vision)
- Les liens sont récupérés avec Firecrawl (rendu JS + captures d'écran)
- Le contenu est injecté dans le contexte de la question pour tous les minds
- Les pièces jointes en échec sont gérées proprement avec des messages de fallback
Conseils :
- Joignez uniquement les fichiers pertinents (chaque fichier allonge le temps de traitement)
- Utilisez les liens pour le contenu web dynamique
- Utilisez les mots-clés pour du contexte web supplémentaire
- Timeout de traitement des fichiers : 30s par fichier
- Timeout de récupération des liens : 15s par URL
Exemple de requête
curl -X POST "https://getminds.ai/api/v1/panels/550e8400-e29b-41d4-a716-446655440000/ask" \
-H "Authorization: Bearer minds_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"question": "On a scale of 1-10, how likely are you to recommend this product?"
}'
Exemple : JavaScript EventSource
const eventSource = new EventSource(
'https://getminds.ai/api/v1/panels/{panelId}/ask',
{
headers: {
'Authorization': 'Bearer minds_your_api_key',
'Content-Type': 'application/json'
}
}
);
// Note: Pour les requêtes POST avec SSE, utilisez fetch avec ReadableStream
const response = await fetch('https://getminds.ai/api/v1/panels/{panelId}/ask', {
method: 'POST',
headers: {
'Authorization': 'Bearer minds_your_api_key',
'Content-Type': 'application/json'
},
body: JSON.stringify({
question: 'How satisfied are you with the current pricing?'
})
});
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
const lines = chunk.split('\n');
for (const line of lines) {
if (line.startsWith('data: ')) {
const event = JSON.parse(line.slice(6));
console.log('Event:', event.type, event);
}
}
}
Réponses d'erreur
400 Bad Request - Question manquante ou aucun groupe attaché
{
"statusCode": 400,
"message": "question is required"
}
{
"statusCode": 400,
"message": "No groups attached to this panel"
}
{
"statusCode": 400,
"message": "No minds in panel groups"
}
403 Forbidden - Accès non autorisé à ce panel
404 Not Found - Le panel n'existe pas
Model Override
Par défaut, les réponses de panel utilisent le fournisseur préféré de votre équipe lorsqu'il est configuré et éligible, sinon la valeur par défaut du produit. Vous pouvez remplacer le modèle et le fournisseur par requête pour mener des expériences sur différentes familles de modèles :
curl -X POST "https://getminds.ai/api/v1/panels/{panelId}/ask" \
-H "Authorization: Bearer minds_…_key" \
-H "Content-Type: application/json" \
-d '{
"question": "Rate this 1-5",
"model": "gpt-4o",
"provider": "openai"
}'
Fournisseurs supportés : openai, anthropic, google. Pour les requêtes de panel, model et provider doivent être envoyés ensemble. Si un seul des deux est envoyé, l'API renvoie 400 Bad Request. Les surcharges par requête sont prioritaires sur la préférence de fournisseur d'équipe.
Disable Diversity Check
L'orchestrateur du panel exécute une boucle de régénération avec contrôle de diversité après génération (vérification d'auto-similarité bigramme, détection d'homogénéité des valeurs, remplissage des buckets vides) avant l'agrégation. Il s'agit de la couche L4 de la recette du panel.
Pour les études d'ablation et les runs de benchmark où vous souhaitez isoler la contribution de cette couche, passez disableDiversityCheck: true :
curl -X POST "https://getminds.ai/api/v1/panels/{panelId}/ask" \
-H "Authorization: Bearer minds_…_key" \
-H "Content-Type: application/json" \
-d '{
"question": "What features matter most to you?",
"disableDiversityCheck": true
}'
Avec ce flag activé, les réponses des panélistes sont retournées exactement telles que générées initialement : aucune régénération en second passage n'est déclenchée, même si les réponses se recoupent fortement. La classification (L3), le RAG par spark (L2) et l'agrégation (L5) continuent de s'exécuter normalement. Économie de coût : environ 5 à 25% d'appels LLM en moins par question de panel, selon le nombre de sparks que le contrôle de diversité aurait signalés.
Quand l'utiliser : comparaisons de méthodes, tests A/B des couches d'orchestration, reproduction du comportement de référence. Les panels en production doivent laisser cette option désactivée (par défaut).
Exporter les résultats du panel
Génère un rapport structuré de tous les résultats du panel au format Markdown.
Endpoint : POST /api/v1/panels/{panelId}/export
Headers :
Authorization: Bearer minds_your_api_key
Content-Type: application/json
Corps de la requête
{
"format": "md"
}
Paramètres
| Paramètre | Type | Requis | Description |
|---|---|---|---|
format | string | Non | Format d'export. Seul "md" (Markdown) est supporté pour l'instant. Par défaut : "md" |
Réponse
{
"data": {
"format": "md",
"content": "# Panel Report: Consumer Research Panel\n\n## Executive Summary\n\nThis panel survey gathered insights from 15 participants across 3 consumer groups...\n\n## Methodology\n\n- 3 groups, 15 participants\n- 5 questions asked\n\n## Results by Question\n\n### Q1: How important is sustainability when choosing products?\n\n**Type:** scale\n\n#### Gen Z Consumers (dominant: Very Important)\n\n..."
}
}
Structure du rapport
Le rapport généré comprend :
- Executive Summary - Synthèse des principaux résultats en 2 à 3 paragraphes
- Methodology - Groupes, participants et structure
- Results by Question - Comparaison inter-groupes avec insights clés et citations
- Cross-Group Analysis - Tendances et patterns entre les groupes
- Conclusions & Recommendations - Insights actionnables
Exemple de requête
curl -X POST "https://getminds.ai/api/v1/panels/550e8400-e29b-41d4-a716-446655440000/export" \
-H "Authorization: Bearer minds_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"format": "md"
}'
Réponses d'erreur
403 Forbidden - Accès non autorisé à ce panel
404 Not Found - Le panel n'existe pas
Vérifier le statut d'un export
Vérifie le statut d'un job d'export de panel. Si aucun jobId n'est fourni, retourne le statut de l'export le plus récent.
Endpoint : GET /api/v1/panels/{panelId}/export-status
Headers :
Authorization: Bearer minds_your_api_key
Paramètres de requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
jobId | string | Non | Identifiant de job spécifique. Si omis, retourne le job d'export le plus récent |
Réponse
{
"data": {
"status": "completed",
"downloadUrl": "/api/v1/panels/{panelId}/export-download?jobId=job-123"
}
}
Valeurs de statut
| Statut | Description |
|---|---|
queued | Le job d'export est en attente de traitement |
processing | L'export est en cours de génération (inclut un champ progress, 0-100) |
completed | L'export est prêt au téléchargement (inclut un champ downloadUrl) |
failed | L'export a échoué (inclut un champ error avec la raison) |
Exemple de requête
curl -X GET "https://getminds.ai/api/v1/panels/{panelId}/export-status?jobId=job-123" \
-H "Authorization: Bearer minds_your_api_key"
Réponses d'erreur
403 Forbidden - Accès non autorisé à ce panel
404 Not Found - Le panel ou le job n'existe pas
Télécharger un export
Télécharge le rapport de panel exporté sous forme de fichier PDF.
Endpoint : GET /api/v1/panels/{panelId}/export-download
Headers :
Authorization: Bearer minds_your_api_key
Paramètres de requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
jobId | string | Oui | L'identifiant du job d'export (issu de la réponse export-status) |
Réponse
Retourne un fichier PDF avec les headers appropriés :
Content-Type: application/pdfContent-Disposition: attachment; filename="Panel-Report.pdf"
Exemple de requête
curl -X GET "https://getminds.ai/api/v1/panels/{panelId}/export-download?jobId=job-123" \
-H "Authorization: Bearer minds_your_api_key" \
-o panel-report.pdf
Réponses d'erreur
400 Bad Request - Paramètre jobId manquant ou job pas encore terminé
403 Forbidden - Accès non autorisé à ce panel
404 Not Found - Le panel ou le job n'existe pas
Exemple de workflow complet
Voici un workflow complet pour créer et utiliser un panel :
# 1. Créez d'abord des groupes de sparks (via l'API Sparks)
# On suppose que vous avez créé des groupes avec les IDs : group-genz, group-millennials
# 2. Créez un panel avec ces groupes
curl -X POST "https://getminds.ai/api/v1/panels" \
-H "Authorization: Bearer minds_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Product Pricing Research",
"groupIds": ["group-genz", "group-millennials"]
}'
# Réponse : { "data": { "id": "panel-123", ... } }
# 3. Posez des questions au panel
curl -X POST "https://getminds.ai/api/v1/panels/panel-123/ask" \
-H "Authorization: Bearer minds_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"question": "What price point would you consider fair for this product?"
}'
# 4. Posez une autre question
curl -X POST "https://getminds.ai/api/v1/panels/panel-123/ask" \
-H "Authorization: Bearer minds_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"question": "How does this compare to competitor pricing?"
}'
# 5. Exportez les résultats sous forme de rapport
curl -X POST "https://getminds.ai/api/v1/panels/panel-123/export" \
-H "Authorization: Bearer minds_your_api_key" \
-H "Content-Type: application/json" \
-d '{"format": "md"}'
# 6. Vérifiez le statut de l'export (interrogez jusqu'à completed)
curl -X GET "https://getminds.ai/api/v1/panels/panel-123/export-status" \
-H "Authorization: Bearer minds_your_api_key"
# Réponse : { "data": { "status": "completed", "downloadUrl": "/api/v1/panels/panel-123/export-download?jobId=..." } }
# 7. Téléchargez le PDF
curl -X GET "https://getminds.ai/api/v1/panels/panel-123/export-download?jobId=job-123" \
-H "Authorization: Bearer minds_your_api_key" \
-o panel-report.pdf
Récapitulatif des codes d'erreur
| Code | Description |
|---|---|
| 400 | Bad Request - Champs requis manquants ou données invalides |
| 401 | Unauthorized - Clé API invalide ou manquante |
| 403 | Forbidden - Accès non autorisé à ce panel |
| 404 | Not Found - Le panel n'existe pas |
| 500 | Internal Server Error - Erreur côté serveur |
Prochaines étapes
- Créez des minds pour alimenter vos groupes de panel
- Découvrez l'authentification
- Consultez les erreurs et limites