Prompts et exécutions

Créez des prompts enregistrés et leurs variables, renseignez-les, exécutez-les sur un ou plusieurs modèles, recevez le résultat en streaming et partagez vos prompts, le tout avec l'API REST.

21 min de lecture · Mis à jour le 28 septembre 2026

Un prompt enregistré est un template réutilisable de votre bibliothèque de prompts. Son texte contient des {{variables}} que vous renseignez à chaque exécution. L’API REST vous permet de construire des prompts depuis votre code, de les exécuter avec de nouvelles valeurs sur le modèle de votre choix, puis d’en récupérer les résultats. Chaque requête s’exécute au nom de l’utilisateur propriétaire de la clé API.

Tous les chemins sont relatifs à https://api.stickyprompts.com/api/v1. Les corps de requête sont en JSON.

Concepts clés

Un prompt est un template nommé. Son texte réside dans une version de prompt : il n’existe qu’une version par prompt, et l’envoi d’un nouveau contenu l’écrase. Une version comporte des variables, référencées dans le texte sous la forme {{slug}}, par exemple Write a {{tone}} summary of: {{text}}.

Pour exécuter un prompt, vous renseignez ses variables. Vous créez ainsi une instance : une copie immuable du template dans laquelle les valeurs ont été substituées. Vous exécutez ensuite l’instance sur un ou plusieurs modèles. Chaque exécution crée une conversation (appelée conversation_context dans l’API), que vous pouvez poursuivre avec les endpoints décrits dans Conversations et messages.

prompt -> prompt_version (content with {{slug}} placeholders) -> variables
                    |
                    +-> instance (variable values, parsed content) -> run -> conversation

Les endpoints raccourcis sous /run/prompt/... créent l’instance et l’exécutent en un seul appel. POST /run envoie du texte brut à un modèle, sans aucun prompt.

Conventions

  • Pagination. Lorsque c’est indiqué, envoyez page (par défaut 1) et size (par défaut 10). Les headers de réponse X-Page, X-Page-Size et X-Total-Count décrivent le résultat. Voir Erreurs, pagination et quotas.
  • Portée projet. Plusieurs endpoints lisent un header facultatif X-Project-ID: <numeric id>. Une valeur non numérique est traitée comme absente.
  • Casse des champs. Les objets de base de données utilisent ID, CreatedAt, UpdatedAt et DeletedAt avec une majuscule, à côté de champs en snake_case. Le résultat RunHistory utilise id et created_at en minuscules.
  • Texte rendu. Les champs result et thinking d’une exécution contiennent du HTML rendu à partir du Markdown du modèle, et non le Markdown brut.
  • Les erreurs ont la forme {"error": "..."}. Les dépassements de quota renvoient 429 {"error":"Quota exceeded","reason":"..."}. Les blocages par les garde-fous ajoutent un code machine, par exemple {"error": "...", "code": "SENSITIVE_DATA_BLOCKED"}. Les échecs liés à la résidence des données utilisent les codes EU_INFERENCE_REQUIRED, ZERO_RETENTION_REQUIRED, NO_PROVIDER_ASSIGNED et NO_ENDPOINT_AVAILABLE.

L’objet Prompt

{
  "ID": 42,
  "CreatedAt": "2026-09-20T10:15:00Z",
  "UpdatedAt": "2026-09-20T10:15:00Z",
  "DeletedAt": null,
  "name": "Renewal check-in email",
  "slug": "k3j9x2qa",
  "user_id": 7,
  "project_id": null,
  "shared_with_workspace_id": null,
  "current_version_id": 88,
  "current_version": null,
  "ai_model_id": 12,
  "description": "Friendly renewal reminder for a Northwind customer",
  "is_favorite": false,
  "category_id": 3,
  "category": null,
  "example_output": "",
  "duplicated_from_id": null,
  "file_data": [],
  "tools": [{ "name": "web_search", "use": true }],
  "mcp_servers": [],
  "ai_style": "prompty"
}
  • current_version vaut {ID, ..., prompt_id, content, variables[], current_instance_id, current_instance} lorsqu’il est chargé ; la plupart des endpoints de liste le laissent à null.
  • category vaut {ID, CreatedAt, UpdatedAt, DeletedAt, name} lorsqu’il est chargé.
  • file_data est un tableau d’objets File lorsqu’il est chargé, sinon null. Un File a la forme {ID, CreatedAt, UpdatedAt, DeletedAt, name, path, preview_path, public_path, user_id, workspace_id, project_id, fileType, partial} ; notez le fileType en camelCase.
  • tools vaut [{"name", "use"}] ou null. Noms d’outils : web_search, image_generation, video_generation, speech_generation, music_generation, remote_mcp.
  • mcp_servers est un tableau d’ID de serveurs MCP distants.

Prompts

GET /prompt

GET /api/v1/prompt
Autorisation prompts_get Outil MCP list_prompts

Liste vos propres prompts qui n’appartiennent à aucun projet, du plus récent au plus ancien. Avec X-Project-ID, liste à la place les prompts de ce projet.

Paramètres de requête
search string dans query facultatif
Recherché dans le nom et la description.
page integer dans query facultatif par défaut 1
Numéro de page.
size integer dans query facultatif par défaut 10
Éléments par page.
X-Project-ID integer dans header facultatif
Liste les prompts de ce projet.

Réponse. 200 avec un tableau d’objets Prompt (current_version, category et file_data non chargés). Avec X-Project-ID, chaque élément comporte aussi "can_delete": bool, qui ne vaut true que si vous pouvez gérer les prompts du projet et que ce prompt vous appartient.

Erreurs. 404 {"error":"Project not found"}, 403 {"error":"You don't have access to this project"}.

GET /prompt/all

GET /api/v1/prompt/all
Autorisation prompts_get

Renvoie en une seule liste vos propres prompts, ceux qui sont partagés avec vous et ceux que vous avez mis en favoris, triés selon la date de votre dernière exécution de chacun (ou, à défaut, leur date de création). Les prompts appartenant à un projet sont exclus.

Paramètres de requête
search string dans query facultatif
Recherché dans le nom et la description.
page integer dans query facultatif par défaut 1
Numéro de page.
size integer dans query facultatif par défaut 10
Éléments par page.
showWorkspaceShared string dans query facultatif
"true" inclut aussi les prompts partagés avec votre espace de travail.

Réponse. 200 avec un tableau d’objets Prompt dont file_data est chargé, ou [].

GET /prompt/last_used

GET /api/v1/prompt/last_used
Autorisation prompts_get

Renvoie jusqu’à 8 prompts que vous avez exécutés, du plus récemment exécuté au plus ancien, avec file_data chargé. Les prompts que vous n’avez jamais exécutés sont omis. Les headers de pagination sont présents, mais page et size sont ignorés.

GET /prompt/most_used

GET /api/v1/prompt/most_used
Autorisation prompts_get

Renvoie jusqu’à 8 prompts, triés selon la fréquence à laquelle vous les avez exécutés. Pas de headers de pagination.

GET /prompt/recently_added

GET /api/v1/prompt/recently_added
Autorisation prompts_get

Renvoie jusqu’à 8 de vos propres prompts, du plus récent au plus ancien, avec file_data chargé.

POST /prompt

POST /api/v1/prompt
Autorisation prompts_manage

Crée un prompt. Celui-ci démarre sans version : appelez ensuite POST /prompt_version pour lui donner un contenu. Le modèle provient de vos préférences (ou, à défaut, du premier modèle du catalogue), et ai_style de vos préférences (ou prompty). Pour modifier l’un ou l’autre, appelez ensuite PUT /prompt/:id.

Corps de la requête
name string facultatif
Non validé à la création, mais envoyez-le.
description string facultatif
Affichée sur la carte du prompt.
example_output string facultatif
Exemple de sortie.
category_id uint facultatif
ID de la catégorie du prompt, ou null.
tools array facultatif
Outils par défaut, [{"name", "use"}].
mcp_servers uint[] facultatif
ID de serveurs MCP distants.
X-Project-ID integer dans header facultatif
Crée le prompt dans ce projet. Vous devez être autorisé à gérer les prompts du projet.

ai_model_id, ai_style et slug sont ignorés à la création ; un slug aléatoire est généré.

curl -X POST https://api.stickyprompts.com/api/v1/prompt \
  -H "Authorization: Bearer $STICKY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Renewal check-in email", "description": "Friendly renewal reminder" }'

Réponse. 201 avec l’objet Prompt.

Erreurs. 400 JSON mal formé, 404 {"error":"Project not found"}, 403 {"error":"You don't have access to manage prompts of this project"}, 409 {"error":"Entity already exists"}.

PUT /prompt/:id

PUT /api/v1/prompt/:id
Autorisation prompts_manage

Remplace les champs modifiables d’un prompt. Uniquement pour vos propres prompts.

Paramètres de chemin
id integer dans path obligatoire
ID numérique du prompt.
Corps de la requête
name string obligatoire
Ne doit pas être vide.
description string facultatif
Valeur écrasée.
ai_model_id uint facultatif
Valeur écrasée. L’omettre ou envoyer 0 enregistre 0.
example_output string facultatif
Valeur écrasée.
category_id uint facultatif
Valeur écrasée.
ai_style string facultatif
Valeur écrasée.
tools array facultatif
Modifié uniquement s’il est présent.
mcp_servers uint[] facultatif
Modifié uniquement s’il est présent.

Tous les champs name, description, ai_model_id, example_output, category_id et ai_style sont écrasés : envoyez donc toujours les valeurs actuelles des champs que vous ne souhaitez pas modifier.

Réponse. 200 avec l’objet Prompt. Erreurs. 404 {"error":"Prompt not found"}, 400 {"error":"Name is required"}.

POST /prompt_version

POST /api/v1/prompt_version
Autorisation prompts_manage

Définit le contenu du template d’un prompt. Le premier appel crée la version et en fait la version courante ; les appels suivants écrasent content sur cette même version. Créez les variables avec POST /variable, et non par ce corps.

Corps de la requête
prompt_id uint obligatoire
L’un de vos propres prompts.
content string obligatoire
Texte du template. Référencez les variables sous la forme {{slug}}.

Réponse. 201, aussi bien à la création qu’à la mise à jour :

{
  "ID": 88, "CreatedAt": "...", "UpdatedAt": "...", "DeletedAt": null,
  "prompt_id": 42,
  "content": "Write a renewal check-in email to {{customer_name}} about their {{plan}} plan.",
  "variables": null,
  "current_instance_id": null,
  "current_instance": null
}

variables n’est pas chargé lors d’une mise à jour. Erreurs. 400 JSON mal formé, 404 {"error":"Prompt not found"}.

DELETE /prompt/:id

DELETE /api/v1/prompt/:id
Autorisation prompts_delete

Supprime de façon logique l’un de vos propres prompts, et le retire de ses partages comme des favoris de tous les utilisateurs.

Paramètres de chemin
id integer dans path obligatoire
ID numérique du prompt.

Réponse. 204. 404 avec un corps vide si le prompt n’existe pas ou ne vous appartient pas.

POST /prompt/:id/duplicate

POST /api/v1/prompt/:id/duplicate
Autorisation prompts_manage

Copie un prompt qui vous appartient ou auquel vous avez accès (catalogue public, prompts partagés avec vous, prompts partagés avec votre espace de travail). La copie reprend le nom, la description, le modèle, l’exemple de sortie, les outils, le style, la catégorie, le contenu de la version et les variables (name, slug, description, data_type, default_value, required, sort, is_primary, is_multi_select, options). Ne sont pas copiés : mcp_servers, les fichiers joints, ainsi que les champs file_types et default_file_id de chaque variable.

Paramètres de chemin
id string dans path obligatoire
ID numérique ou slug du prompt.
Headers
X-Project-ID integer dans header facultatif
Crée la copie dans ce projet en conservant le nom d’origine. Sans ce header, " (copy)" est ajouté au nom.

Réponse. 200 avec le nouvel objet Prompt, current_version.variables renseigné.

Erreurs. 404 {"error":"Prompt not found"}, 403 {"error":"You don't have access to this prompt"}, 404 {"error":"Project not found"}, 403 {"error":"You don't have access to manage prompts of this project"}.

PUT /prompt/:id/move-to-project

PUT /api/v1/prompt/:id/move-to-project
Autorisation prompts_manage

Déplace un prompt dans un projet, d’un projet à un autre, ou hors d’un projet. Sans corps. Vous devez être autorisé à gérer les prompts de chaque projet concerné, et un prompt déplacé dans un projet doit vous appartenir.

Paramètres de chemin
id integer dans path obligatoire
ID numérique du prompt.
Headers
X-Project-ID integer dans header facultatif
Le projet cible. Omettez-le pour retirer le prompt de son projet.

Réponse. 200 avec l’objet Prompt, project chargé.

Erreurs. 404 {"error":"Prompt not found"} ou {"error":"Prompt not found or you don't have access to it"}, 400 {"error":"Prompt is already not in a project"}, 400 {"error":"Prompt is already in this project"}, 404 {"error":"Project not found"}, 403 sans autorisation sur les projets.

PUT /prompt/:id/share_with_workspace

PUT /api/v1/prompt/:id/share_with_workspace
Autorisation prompts_manage

Rend l’un de vos propres prompts visible par tout votre espace de travail, ou de nouveau privé.

Paramètres de chemin
id integer dans path obligatoire
ID numérique du prompt.
Corps de la requête
shared bool obligatoire
true pour le partager avec l’espace de travail, false pour le rendre privé.

Réponse. 200 avec l’objet Prompt ; shared_with_workspace_id contient l’ID de votre espace de travail ou null. Erreurs. 404 {"error":"Prompt not found"}, 400 {"error":"User is not part of a workspace"}.

Favoris

GET /prompt/favorite

GET /api/v1/prompt/favorite
Autorisation prompts_get

Renvoie vos prompts favoris dans l’ordre où vous les avez ajoutés (du plus ancien au plus récent). Chaque élément comporte "is_favorite": true ; la version, la catégorie et les fichiers ne sont pas chargés. Pas de pagination.

POST /prompt/:id/favorite

POST /api/v1/prompt/:id/favorite
Autorisation prompts_manage

Ajoute un prompt à vos favoris. Il doit vous appartenir, être partagé directement avec vous ou faire partie du catalogue public. Un prompt partagé uniquement avec votre espace de travail renvoie 403.

Paramètres de chemin
id integer dans path obligatoire
ID numérique du prompt.

Réponse. 201. La clé du prompt imbriqué s’écrit bel et bien Prompt, avec une majuscule :

{ "ID": 311, "CreatedAt": "2026-09-28T09:00:00Z", "UpdatedAt": "2026-09-28T09:00:00Z", "DeletedAt": null,
  "user_id": 7, "prompt_id": 42, "Prompt": null }

Erreurs. 404 {"error":"Prompt not found"}, 403 {"error":"You don't have access to this prompt"}, 409 {"error":"This prompt is already marked as favorite"}.

DELETE /prompt/:id/favorite

DELETE /api/v1/prompt/:id/favorite
Autorisation prompts_manage

Retire un prompt de vos favoris.

Paramètres de chemin
id integer dans path obligatoire
ID numérique du prompt.

Réponse. 204. Erreurs. 404 {"error":"Prompt not found in favorites"}.

Variables

Les variables appartiennent à une version de prompt. Le slug doit correspondre à un emplacement {{slug}} du contenu et être unique au sein de la version. Consultez Variables de prompt pour leur comportement dans l’application.

{
  "ID": 301, "CreatedAt": "...", "UpdatedAt": "...", "DeletedAt": null,
  "prompt_version_id": 88,
  "name": "Customer name",
  "slug": "customer_name",
  "description": "Who the email is addressed to",
  "data_type": "short_text",
  "default_value": "",
  "required": true,
  "sort": 0,
  "is_primary": true,
  "is_multi_select": false,
  "options": null,
  "file_types": "",
  "default_file_id": null,
  "default_file": null
}
  • data_type vaut short_text, long_text, select, number, json ou lov.
  • options (pour les variables à choix) vaut [{"label": "...", "value": "..."}].
  • is_primary désigne la variable que renseignent les raccourcis /run/prompt/last et /run/prompt/:id.

POST /variable

POST /api/v1/variable

Ajoute une variable à une version de prompt. Le prompt doit vous appartenir. Le corps est l’objet Variable sans ID ni horodatages ; le serveur ne valide que les trois premiers champs ci-dessous.

Corps de la requête
prompt_version_id uint obligatoire
La version à laquelle ajouter la variable.
name string obligatoire
Nom affiché.
slug string obligatoire
Correspond à {{slug}} dans le contenu.
description string facultatif
Texte d’aide.
data_type string facultatif
short_text, long_text, select, number, json ou lov.
default_value string facultatif
Utilisée lorsqu’aucune valeur n’est envoyée.
required bool facultatif
Appliqué par POST /instance.
sort integer facultatif
Ordre d’affichage.
is_primary bool facultatif
La variable que renseignent les endpoints raccourcis.
is_multi_select bool facultatif
Autorise plusieurs options.
options array facultatif
[{"label", "value"}].
file_types string facultatif
Types de fichiers acceptés.
default_file_id uint facultatif
Fichier par défaut.

Réponse. 201 avec l’objet Variable.

Erreurs. 400 JSON mal formé, 404 {"error":"Prompt version not found"}, 403 {"error":"You are not allowed to add variables to this prompt"}, 409 {"error":"Entity already exists"} (slug en double).

PUT /variable/:id

PUT /api/v1/variable/:id

Remplace les champs d’une variable. La mise à jour écrase tous les champs : envoyez-les donc tous, à savoir name, slug, description, data_type, default_value, required, sort, is_primary, is_multi_select, options, file_types et default_file_id.

Paramètres de chemin
id integer dans path obligatoire
ID de la variable.

L’historique est préservé : si vous modifiez name ou slug sur une variable qui possède déjà des valeurs enregistrées lors d’exécutions précédentes, le serveur archive d’abord l’ancienne variable (une copie supprimée de façon logique dont le slug reçoit le suffixe _deleted_<timestamp>), y transfère ces valeurs, puis met à jour la variable sur place. Dans ce cas, file_types et default_file_id ne sont pas mis à jour.

Réponse. 200 avec l’objet Variable. Erreurs. 404 {"error":"Variable not found"}, 403 {"error":"You are not allowed to update variables of this prompt"}.

DELETE /variable/:id

DELETE /api/v1/variable/:id

Supprime une variable.

Paramètres de chemin
id integer dans path obligatoire
ID de la variable.

Réponse. 204. Erreurs. 404 {"error":"Variable not found"}, 403 {"error":"You are not allowed to delete variables of this prompt"}.

Instances

Une instance est le template dont les valeurs ont été renseignées. Chaque {{slug}} est remplacé par la valeur que vous avez envoyée, ou par la default_value de la variable lorsque la valeur est vide ou absente. Les emplacements qui ne correspondent à aucune variable restent tels quels. Si votre espace de travail utilise des garde-fous, ceux-ci s’appliquent aux valeurs et au contenu après substitution avant tout enregistrement : les valeurs peuvent donc revenir masquées.

{
  "ID": 5120, "CreatedAt": "...", "UpdatedAt": "...", "DeletedAt": null,
  "prompt_version_id": 88,
  "content": "Write a renewal check-in email to Northwind Traders about their Business plan.",
  "variable_values": [
    { "ID": 9001, "variable_id": 301, "prompt_version_instance_id": 5120, "value": "Northwind Traders", "file_id": null, "file": null }
  ]
}

POST /instance

POST /api/v1/instance
Autorisation prompts_manage

Renseigne les variables d’une version et enregistre le résultat comme nouvelle instance, qui devient aussi l’instance courante de la version.

Corps de la requête
prompt_version_id uint obligatoire
La version à renseigner.
variable_values array facultatif
Éléments {"variable_id": uint, "value": string, "file_id": uint | null}. Obligatoire lorsque la version comporte des variables obligatoires.
curl -X POST https://api.stickyprompts.com/api/v1/instance \
  -H "Authorization: Bearer $STICKY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt_version_id":88,"variable_values":[{"variable_id":301,"value":"Northwind Traders"},{"variable_id":302,"value":"Business"}]}'

Réponse. 201 avec l’objet instance.

Erreurs. 404 {"error":"Prompt version not found"}, 400 {"error":"Invalid instance request"} lorsqu’une variable obligatoire n’a pas de valeur non vide, 400 {"error":"...","code":"SENSITIVE_DATA_BLOCKED"} lorsqu’un garde-fou bloque l’entrée.

GET /instance/:id

GET /api/v1/instance/:id
Autorisation prompts_get

Renvoie une instance avec ses variable_values. 404 avec un corps vide si elle n’existe pas.

Paramètres de chemin
id integer dans path obligatoire
ID de l’instance.

Exécuter des prompts

Choix du modèle

EndpointModèle utilisé
POST /instance/:id/run et /run/streamChaque ID de ai_model_ids. Il n’y a ni valeur par défaut ni valeur "auto" : sans ID, rien n’est exécuté. Avec agent_id, ou lorsque vous poursuivez une conversation liée à un agent, le modèle de l’agent remplace ai_model_ids.
POST /run/prompt/last et POST /run/prompt/:idLe modèle de l’exécution rejouée. Lorsque /run/prompt/:id n’a aucune exécution antérieure, le ai_model_id du prompt lui-même.
POST /run/prompt/:id/variablesLe ai_model_id du prompt.
POST /runai_model_id, ou le modèle dont la version (l’identifiant du modèle chez le fournisseur) est égale à ai_model_name.

Aucun de ces endpoints n’utilise le routage automatique des modèles, réservé aux endpoints de conversation. Chaque endpoint d’exécution vérifie le modèle choisi au regard des règles d’accès aux modèles de votre espace de travail (400 {"error":"The selected AI model has been restricted by your organization"}, formulé légèrement différemment sur les raccourcis) et de ses règles de résidence des données (400 avec un code de résidence).

L’objet RunHistory

{
  "id": 7781,
  "created_at": "2026-09-28T09:12:03Z",
  "result": "<p>Hi Northwind team, your Business plan renews on ...</p>\n",
  "raw_text": null,
  "thinking": "",
  "runtime": 4210,
  "ai_model_id": 12,
  "input_prompt": "Write a renewal check-in email to {{customer_name}} about their {{plan}} plan.",
  "variables": [],
  "conversation_context_id": 16044,
  "conversation_context_slug": "q8w2m1zc",
  "conversation_context_name": "",
  "is_interactive": true,
  "input_file_data": [],
  "output_file_data": [],
  "error_text": null,
  "error_id": null,
  "run_status": "success"
}
ChampSignification
resultLa réponse du modèle, convertie du Markdown en HTML. Les blocs <think> sont supprimés.
raw_textToujours null ici. Pour obtenir le Markdown brut, lisez la conversation (GET /conversation/:id) ou le raw_text du flux.
thinkingLe raisonnement rendu en HTML, ou "".
runtimeMillisecondes écoulées entre le début et la fin. 0 tant que l’exécution n’est pas terminée, par exemple dans la réponse en streaming.
input_promptLe template brut, sans substitution. Le texte après substitution est le content de l’instance.
variablesÉléments {id, variable_id, name, slug, value}. Vide sur les endpoints d’exécution ; renseigné par GET /prompt/:id/run_history.
conversation_context_id, _slug, _nameLa conversation créée ou poursuivie par cette exécution.
is_interactiveIndique si la conversation peut être poursuivie. false pour les exécutions en mode comparaison.
input_file_data, output_file_dataFichiers {id, name, path} joints au message utilisateur, et fichiers générés par le modèle.
run_statuspending, puis generating, puis success ou error.
error_text, error_idRenseignés en cas d’échec de l’appel au fournisseur.

L’utilisation et les crédits ne figurent dans aucune réponse d’exécution.

POST /instance/:id/run

POST /api/v1/instance/:id/run
Autorisation run_prompt

Exécute une instance et attend que le modèle ait terminé. Une nouvelle conversation contenant le message utilisateur (le contenu de l’instance après substitution) et la réponse de l’IA est créée, sauf si vous passez conversation_context_id. Si cette conversation comporte une comparaison de modèles active, l’instance est exécutée une fois dans chaque fil et tous les résultats sont renvoyés.

Paramètres de chemin
id integer dans path obligatoire
ID de l’instance, obtenu avec POST /instance.
Paramètres de requête
comparison_mode string dans query facultatif par défaut false
"true" marque la conversation comme non interactive ; un modèle soumis à restriction produit alors « One of the selected AI models has been restricted by your organization ».
X-Project-ID integer dans header facultatif
Les fichiers du projet sont ajoutés aux pièces jointes de l’exécution et la conversation est classée dans le projet.
Corps de la requête
ai_model_ids uint[] obligatoire
Une exécution par ID de modèle. Obligatoire en pratique : un tableau vide n’exécute rien et renvoie 200 null. Le nombre d’ID est limité par la configuration du serveur (1 par défaut) ; au-delà, l’appel renvoie 503 {"error":"cannot run this many models in parallel"}. L’offre gratuite ne peut pas en envoyer plus d’un : 503 {"error":"free tier does not support comparison mode"}.
ai_style string facultatif
Style de réponse, par exemple prompty. Il n’est pas repris automatiquement du prompt : passez donc le ai_style du prompt.
attachments array facultatif
Éléments {"id": uint, "type": "file" | "transcription", "temp": bool}. Les fichiers dont le modèle ne prend pas en charge l’extension sont ignorés sans avertissement.
conversation_context_id uint facultatif
Poursuit cette conversation au lieu d’en créer une.
is_prompt_studio bool facultatif
Marque la conversation comme une exécution Prompt Studio (source studio). Seules les exécutions Studio apparaissent dans GET /prompt/:id/run_history.
flash_mode bool facultatif
Transmis au moteur d’exécution du modèle.
reasoning_effort string facultatif
Pour les modèles de raisonnement, par exemple low, medium ou high. Les valeurs autorisées dépendent du modèle ; une valeur inconnue est remplacée par la valeur par défaut du modèle.
knowledge_base_ids uint[] facultatif
Bases de connaissances dont tirer le contexte. Seules celles auxquelles vous avez accès sont utilisées.
knowledge_base_limit_node_ids uint[] facultatif
Limite la recherche à ces nœuds.
world_knowledge bool facultatif
Avec des bases de connaissances, indique si le modèle peut aussi recourir à ses connaissances générales.
agent_id uint facultatif
Exécute la requête en tant que cet agent. Son modèle, son prompt système, ses fichiers, ses outils, ses serveurs MCP et ses bases de connaissances remplacent les champs de la requête.
tools array facultatif
Éléments {"name", "use", "mcp_tool_id"}. mcp_tool_id n’est nécessaire que pour remote_mcp.
curl -X POST https://api.stickyprompts.com/api/v1/instance/5120/run \
  -H "Authorization: Bearer $STICKY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ai_model_ids":[12],"ai_style":"prompty","tools":[{"name":"web_search","use":true}]}'
import os, requests

r = requests.post(
    "https://api.stickyprompts.com/api/v1/instance/5120/run",
    headers={"Authorization": f"Bearer {os.environ['STICKY_API_KEY']}"},
    json={"ai_model_ids": [12], "ai_style": "prompty",
          "tools": [{"name": "web_search", "use": True}]},
    timeout=300,
)
r.raise_for_status()
for run in r.json():
    if run["run_status"] == "error":
        print("Failed:", run["error_text"], run["error_id"])
    else:
        print(run["conversation_context_id"], run["result"])  # result is HTML
const res = await fetch("https://api.stickyprompts.com/api/v1/instance/5120/run", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.STICKY_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    ai_model_ids: [12],
    ai_style: "prompty",
    tools: [{ name: "web_search", use: true }],
  }),
});
const runs = await res.json(); // one RunHistory per model
for (const run of runs) console.log(run.run_status, run.error_id ?? run.result);

Réponse. 200 avec un tableau d’objets RunHistory, un par modèle.

Erreurs

StatutCas
400JSON non valide ; modèle soumis à restriction ; violation des règles de résidence (avec code) ; base de connaissances introuvable ; projet non valide ({"error":"Invalid project ID"}) ; blocage lié aux données sensibles (code: SENSITIVE_DATA_BLOCKED) ; erreurs MCP ({"error": "...", "error_code": "..."}).
404Instance introuvable (corps vide), {"error":"ConversationContext not found"}, {"error":"Agent not found"}, {"error":"Project not found"}.
429Quota dépassé.
503Autres échecs avant l’appel au modèle, comme la limite du nombre de modèles ou la restriction de l’offre gratuite.

POST /instance/:id/run/stream

POST /api/v1/instance/:id/run/stream
Autorisation run_prompt

Accepte les mêmes chemin, paramètres de requête, header et corps que /run et applique la même validation, mais ne diffuse rien dans cette réponse HTTP. À la place :

  1. Le serveur crée les exécutions et la conversation, lance la génération en arrière-plan et renvoie aussitôt 200 avec un tableau d’objets RunHistory en run_status: "pending", result: "", runtime: 0, chacun avec un conversation_context_id valide.
  2. Les tokens sont transmis au WebSocket de la conversation, GET /conversation/{conversation_context_id}/ws. Celui-ci accepte le même header Authorization: Bearer et nécessite l’autorisation conversations_get. Les clients côté serveur peuvent envoyer ce header ; les navigateurs, non.
  3. Chaque trame est un message texte JSON {"type": ..., "data": ...} :
typedataRemarques
messageObjet MessageUn instantané complet du message de l’IA à cet instant, et non un delta. text contient le rendu HTML et raw_text le Markdown ; on y trouve aussi parts, thinking, citations, status (thinking, generating, finished) et ai_model_id. Remplacez votre copie à chaque trame.
run_dataRunHistoryEnvoyé avec les mises à jour du message. result contient le HTML produit jusque-là et run_status le statut actuel.
ai_message_endaucuneLa génération s’est terminée avec succès.
error_messageObjet MessageLa génération a échoué ; voir error_text, error_id et error_code. Événement final.
ai_model_change{ai_model_id, ai_style, auto_model_type, reasoning_effort}Les réglages de la conversation ont changé. Non spécifique aux exécutions de prompts.
  1. Après ai_message_end, lisez l’état final avec GET /conversation/:id.

Les événements envoyés avant la connexion d’un client sont mis en mémoire tampon et rejoués à la première connexion : vous pouvez donc ouvrir le socket juste après le retour du POST. Votre propre message utilisateur ne vous est pas renvoyé en écho. Une fois que le POST a renvoyé 200, les erreurs du fournisseur n’arrivent plus que sous forme de trames error_message ; les erreurs antérieures à la génération (limite du nombre de modèles, offre gratuite, résidence) reviennent avec les statuts autres que 200 listés pour /run. L’ancien endpoint SSE GET /conversation/:id/stream ne relaie pas les instantanés de message pour ces exécutions : utilisez donc le WebSocket. Tous les détails sur le WebSocket, ainsi que des exemples de clients, figurent dans Conversations et messages.

POST /run/prompt/last

POST /api/v1/run/prompt/last
Autorisation run_prompt

Rejoue votre exécution de prompt la plus récente avec de nouvelles « données principales ». Conçu pour relancer rapidement un prompt, par exemple depuis une extension de navigateur. L’endpoint retient l’exécution la plus récente parmi tous les prompts qui vous appartiennent ou qui sont partagés avec vous, construit une nouvelle instance dans laquelle la variable principale (ou la seule variable) reçoit data tandis que chaque autre variable conserve sa valeur de cette exécution (ou sa valeur par défaut), puis l’exécute avec le même modèle, les mêmes outils et le ai_style du prompt. Une nouvelle conversation interactive est créée (source extension).

Corps de la requête
data string obligatoire
Nouveau texte pour la variable principale.

Réponse. 200 avec un objet RunHistory unique, et non un tableau.

Erreurs. 404 {"error":"No runs found"}, 400 {"error":"Invalid instance request"} lorsqu’une variable obligatoire se retrouve vide, 400 pour un modèle soumis à restriction ou un blocage lié à la résidence ou aux données sensibles, 429 en cas de dépassement de quota. Si l’appel au modèle échoue avant l’enregistrement d’une exécution, la requête échoue avec 500.

POST /run/prompt/:id

POST /api/v1/run/prompt/:id
Autorisation run_prompt

Identique à /run/prompt/last, mais pour un prompt précis. Rejoue la dernière exécution du prompt en plaçant data dans la variable principale. Si le prompt n’a jamais été exécuté et qu’il vous appartient, une première exécution est construite à partir des valeurs par défaut des variables et du ai_model_id du prompt. L’exécution rejouée est la dernière exécution du prompt tous utilisateurs confondus, et pas seulement la vôtre : sur un prompt partagé, les valeurs non principales peuvent donc provenir de la dernière exécution d’un autre utilisateur.

Paramètres de chemin
id integer dans path obligatoire
ID numérique du prompt.
Corps de la requête
data string obligatoire
Nouveau texte pour la variable principale.
curl -X POST https://api.stickyprompts.com/api/v1/run/prompt/42 \
  -H "Authorization: Bearer $STICKY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"data":"Northwind Traders"}'

Réponse. 200 avec un objet RunHistory unique. Erreurs. 404 {"error":"Prompt not found"}, ainsi que les erreurs de /run/prompt/last.

POST /run/prompt/:id/variables

POST /api/v1/run/prompt/:id/variables
Autorisation run_prompt Outil MCP run_prompt

Exécute la version courante d’un prompt avec un jeu complet de valeurs de variables : création de l’instance et exécution en un seul appel. Utilise le ai_model_id et le ai_style du prompt. La nouvelle instance devient l’instance courante de la version, et une nouvelle conversation interactive est créée (source extension).

Paramètres de chemin
id integer dans path obligatoire
ID numérique du prompt. Le prompt doit vous appartenir ou être partagé avec vous.
Corps de la requête
variable_values array facultatif
Éléments {"variable_id": uint, "value": string, "file_id": uint | null}. Les valeurs omises ou vides sont remplacées par la valeur par défaut. required n’est pas appliqué ici.
web_context string facultatif
Texte supplémentaire placé avant le prompt après substitution, séparé par une ligne vide. Les garde-fous s’y appliquent.
tools array facultatif
Même format que dans POST /instance/:id/run.
curl -X POST https://api.stickyprompts.com/api/v1/run/prompt/42/variables \
  -H "Authorization: Bearer $STICKY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"variable_values":[{"variable_id":301,"value":"Northwind Traders"},{"variable_id":302,"value":"Business"}]}'
import os, requests

r = requests.post(
    "https://api.stickyprompts.com/api/v1/run/prompt/42/variables",
    headers={"Authorization": f"Bearer {os.environ['STICKY_API_KEY']}"},
    json={"variable_values": [
        {"variable_id": 301, "value": "Northwind Traders"},
        {"variable_id": 302, "value": "Business"},
    ]},
    timeout=300,
)
run = r.json()
print(run["run_status"], run["result"])
const run = await fetch("https://api.stickyprompts.com/api/v1/run/prompt/42/variables", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.STICKY_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    variable_values: [
      { variable_id: 301, value: "Northwind Traders" },
      { variable_id: 302, value: "Business" },
    ],
  }),
}).then((r) => r.json());
console.log(run.run_status, run.result);

Réponse. 200 avec un objet RunHistory unique.

Erreurs. 404 {"error":"Prompt not found"}, 400 pour un modèle soumis à restriction ou un blocage lié à la résidence ou aux données sensibles, 429 en cas de dépassement de quota, 503 {"error":"..."} en cas d’échec de l’exécution.

L’outil MCP run_prompt remplit la même fonction à partir d’une table associant les slugs des variables à leurs valeurs ; il ne renvoie que le texte et ne crée pas de conversation interactive.

POST /run

POST /api/v1/run
Autorisation custom_run Outil MCP custom_run

Envoie du texte libre à un modèle et renvoie la réponse, sans prompt, sans variables et sans conversation. L’appel est synchrone. Aucun prompt système, prompt d’espace de travail ni instruction de projet n’est ajouté, le style est fixé à prompty et rien n’est enregistré comme conversation. L’utilisation est tout de même comptabilisée.

Corps de la requête
prompt string obligatoire
Le texte envoyé comme unique message utilisateur.
ai_model_id uint facultatif
ID du modèle. Envoyez ce champ ou ai_model_name.
ai_model_name string facultatif
Comparé au champ version du modèle, c’est-à-dire l’identifiant du modèle chez le fournisseur. Envoyez ce champ ou ai_model_id.
curl -X POST https://api.stickyprompts.com/api/v1/run \
  -H "Authorization: Bearer $STICKY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"Suggest a subject line for a Northwind renewal email.","ai_model_id":12}'
import os, requests

r = requests.post(
    "https://api.stickyprompts.com/api/v1/run",
    headers={"Authorization": f"Bearer {os.environ['STICKY_API_KEY']}"},
    json={"prompt": "Suggest a subject line for a Northwind renewal email.", "ai_model_id": 12},
    timeout=300,
)
r.raise_for_status()
print(r.json()["text"])  # raw Markdown
const msg = await fetch("https://api.stickyprompts.com/api/v1/run", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.STICKY_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ prompt: "Suggest a subject line for a Northwind renewal email.", ai_model_id: 12 }),
}).then((r) => r.json());
console.log(msg.text); // raw Markdown

Réponse. 200 avec un objet Message non enregistré : son ID vaut 0 et ses horodatages sont à zéro. text contient le Markdown brut du modèle, contrairement aux endpoints d’exécution, qui renvoient du HTML.

{
  "ID": 0, "CreatedAt": "0001-01-01T00:00:00Z", "UpdatedAt": "0001-01-01T00:00:00Z", "DeletedAt": null,
  "conversation_context_id": null,
  "ai_model_id": 12,
  "text": "Your Northwind plan renews soon - here is what is new",
  "isUser": false,
  "error_text": null, "error_id": null,
  "ai_style": "prompty",
  "status": "finished",
  "type": "normal"
}

Erreurs. 404 {"error":"AI model not found"}, 400 pour un modèle soumis à restriction ou un blocage lié à la résidence ou aux données sensibles, 429 en cas de dépassement de quota, 500 {"error":"..."} en cas d’échec de l’appel au modèle (cet endpoint utilise 500, et non 503).

GET /prompt/:id/run_history

GET /api/v1/prompt/:id/run_history
Autorisation prompts_get

Renvoie votre historique d’exécutions Prompt Studio pour un prompt, de la conversation la plus récente à la plus ancienne. Seules les conversations que vous avez démarrées avec is_prompt_studio: true sont incluses.

Paramètres de chemin
id integer dans path obligatoire
ID numérique du prompt. Le prompt doit vous appartenir, être partagé avec vous ou faire partie du catalogue.
Paramètres de requête
page integer dans query facultatif par défaut 1
Numéro de page. Les headers de pagination comptent des conversations.
size integer dans query facultatif par défaut 10
Conversations par page.

Réponse. 200 avec un tableau de tableaux d’objets RunHistory : un tableau interne par conversation, avec plusieurs éléments lorsque cette exécution comparait des modèles. variables est renseigné ici. [] s’il n’y a rien.

Fichiers de prompt

Il s’agit des fichiers joints au prompt lui-même. Les modèles utilisant le protocole OpenAI s’en servent via la recherche de fichiers ; les modèles Together les reçoivent sous forme de message utilisateur supplémentaire ; pour les autres fournisseurs, leur utilisation n’est pas documentée. Envoyez d’abord les fichiers avec POST /file.

POST /prompt/:id/file

POST /api/v1/prompt/:id/file
Autorisation prompts_manage

Associe des fichiers envoyés à un prompt. Les fichiers associés auparavant le restent.

Paramètres de chemin
id integer dans path obligatoire
ID numérique du prompt.
Corps de la requête
file_ids uint[] obligatoire
ID des fichiers envoyés.

Réponse. 200 avec l’objet Prompt ; file_data ne liste que les fichiers ajoutés par cet appel.

Erreurs. 400 {"error":"Invalid request body"}, 400 {"error":"Invalid prompt ID"}, 404 {"error":"Prompt not found"}, 400 {"error":"File not found"}.

GET /prompt/:id/file

GET /api/v1/prompt/:id/file
Autorisation prompts_get

Renvoie un tableau des objets File associés au prompt. 400 si id n’est pas numérique.

Paramètres de chemin
id integer dans path obligatoire
ID numérique du prompt.

DELETE /prompt/:id/file/:fileId

DELETE /api/v1/prompt/:id/file/:fileId
Autorisation prompts_manage

Dissocie un fichier de l’un de vos propres prompts. Si aucun autre prompt ni message n’utilise ce fichier, le fichier stocké est également supprimé.

Paramètres de chemin
id integer dans path obligatoire
ID numérique du prompt.
fileId integer dans path obligatoire
ID du fichier.

Réponse. 204. Erreurs. 404 {"error":"Prompt not found"}, 403 {"error":"You do not have permission to delete this file from the prompt"}, 404 {"error":"File not found"}, 502 {"error":"Failed to delete file"}.

Partage avec des utilisateurs

GET /share

GET /api/v1/share
Autorisation prompts_get

Renvoie les prompts partagés avec vous, du plus récent au plus ancien.

Paramètres de requête
scope string dans query facultatif par défaut all
user (partagés directement avec vous), workspace (partagés avec votre espace de travail) ou all.
search string dans query facultatif
Filtre textuel.
page integer dans query facultatif par défaut 1
Numéro de page.
size integer dans query facultatif par défaut 10
Éléments par page.

Réponse. 200 avec un tableau d’objets Prompt, chacun accompagné d’un objet shared_by. scope=workspace sans espace de travail renvoie [] ; dans les autres portées, un résultat vide vaut null, et non [].

[{ "ID": 42, "name": "Renewal check-in email", "...": "...",
   "shared_by": { "email": "john.smith@northwind.example", "first_name": "John", "last_name": "Smith" } }]

Erreurs. 400 {"error":"Invalid scope parameter"}.

GET /prompt/:id/share

GET /api/v1/prompt/:id/share
Autorisation prompts_get

Liste les utilisateurs avec lesquels un prompt est partagé. Chaque Share comporte un objet user complet.

Paramètres de chemin
id integer dans path obligatoire
ID numérique du prompt.
[{ "ID": 55, "CreatedAt": "...", "UpdatedAt": "...", "DeletedAt": null,
   "user_id": 19, "user": { "ID": 19, "email": "anna@northwind.example", "first_name": "Anna", "status": "active", "...": "..." },
   "prompt_id": 42, "read_only": true }]

POST /share/:id

POST /api/v1/share/:id
Autorisation prompts_manage

Partage le prompt :id en lecture seule avec un utilisateur, par e-mail. Si aucun compte n’existe pour cette adresse, le serveur crée un compte invité et envoie un e-mail d’invitation ; un utilisateur déjà invité reçoit de nouveau l’invitation.

Paramètres de chemin
id integer dans path obligatoire
ID du prompt.
Corps de la requête
email string obligatoire
L’adresse e-mail du destinataire.

Réponse. 200 avec un corps vide. Erreurs. 404 {"error":"prompt not found"}, 400 {"error":"invalid email format"}, 400 {"error":"share already exists"}, 400 {"error":"..."} lorsque l’invitation échoue.

POST /share/:id/resend

POST /api/v1/share/:id/resend
Autorisation prompts_manage

Renvoie l’e-mail d’invitation à un utilisateur qui ne s’est pas encore inscrit.

Paramètres de chemin
id integer dans path obligatoire
L’ID du prompt.
Corps de la requête
email string obligatoire
L’adresse invitée.

Réponse. 204. Erreurs. 400 {"error":"invalid email format"}, 404 {"error":"prompt not found"}, 404 {"error":"user not found"}, 400 {"error":"user not invited or already registered"}, 404 {"error":"share not found"}.

DELETE /share/:id

DELETE /api/v1/share/:id
Autorisation prompts_manage

Supprime un partage et annule les invitations en attente de cet utilisateur.

Paramètres de chemin
id integer dans path obligatoire
L’ID du partage (l’ID renvoyé par GET /prompt/:id/share), et non l’ID du prompt.

Réponse. 204. Erreurs. 404 {"error":"share not found"}.