Référence de l'API Jenova Agent
URL de base : https://api.jenova.ai/v1
Authentification : Token Bearer dans l'en-tête Authorization
Table des matières
- Présentation
- Démarrage rapide
- Concepts fondamentaux
- Authentification
- Points de terminaison de l'API
- Diffusion en continu (SSE)
- Intégration du serveur MCP
- Facturation
- Limites de débit
- Gestion des erreurs
- Pagination
- Localisation
- Confidentialité et données
- Support
Présentation
Créez et exécutez des agents IA prêts pour la production sans avoir à assembler vous-même la pile technologique sous-jacente. L'API Jenova Agent réunit toutes les capacités essentielles au sein d'un service géré unique :
La pile Agent complète
- Orchestration d'Agent : Une couche d'orchestration unifiée coordonne modèles, outils, mémoire et récupération à travers des workflows complexes.
- Mémoire et contexte : Mémoire de conversation et contexte illimités intégrés à chaque Session. Aucune gestion d'état externe requise.
- Outils et MCP : Intégrations d'Outils illimitées avec des outils natifs de la plateforme et n'importe quel serveur MCP distant, prêtes à l'emploi.
- Utilisez n'importe quel Modèle : Alimentez vos Agents avec des Modèles d'OpenAI, Anthropic, Google, xAI, Qwen, et bien d'autres, via une intégration unique.
- Stockage entièrement géré : Bases de données relationnelles et vectorielles gérées avec RAG intégré. Aucune infrastructure à provisionner ou à faire évoluer.
- Niveau production : Utilisé par des centaines de milliers d'utilisateurs. Infrastructure entièrement gérée, API stables, conçu pour le trafic de production.
Démarrage rapide
1. Obtenez votre clé API
Générez une Clé API depuis le Tableau de bord développeur à l'adresse www.jenova.ai/platform. Les clés utilisent le format jnv_sk_* et sont transmises sous forme de Tokens Bearer.
2. Choisissez ou créez un Agent
Choisissez un Agent prédéfini sur la plateforme, ou créez un Agent personnalisé dans le Tableau de bord avec des instructions, des paramètres de Modèle, des fichiers de Base de connaissances, des Outils et des serveurs MCP.
3. Envoyez votre premier Message
Créez une Session et envoyez un message en un seul appel :
curl -N -X POST https://api.jenova.ai/v1/messages \
-H "Authorization: Bearer jnv_sk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"agent": "my-support-agent",
"user": "user_12345",
"content": "What can you help me with?"
}'
La réponse est renvoyée en continu sous forme de Server-Sent Events :
event: stream_started
data: {"session_id":"ses_xyz789","run_id":"run_abc123","agent":"my-support-agent"}
event: stream_delta
data: {"session_id":"ses_xyz789","run_id":"run_abc123","chunk_content":"I can help you with ","seq":1}
event: stream_ended
data: {"session_id":"ses_xyz789","run_id":"run_abc123","success":true,"stop_reason":"end_run","usage":{"cost":"0.0032"}}
Récupérez session_id depuis stream_started pour les requêtes de suivi. Pour les réponses JSON synchrones, consultez Envoyer un Message.
Concepts fondamentaux
Agent
Un agent IA avec lequel vous interagissez via l'API. Chaque Agent possède un slug unique (par exemple, my-support-agent) utilisé comme valeur agent dans les appels API.
- Prédéfini : Sélectionnez parmi les Agents existants sur la plateforme.
- Personnalisé : Configurez le vôtre dans le Tableau de bord avec des instructions, un Modèle, une Base de connaissances, des Outils et des serveurs MCP.
Session
Un fil de conversation indépendant entre un Utilisateur final et un Agent.
- Identifiant : ID préfixé (par exemple,
ses_abc123) - Portée : Plusieurs Sessions peuvent exister pour le même Agent et le même Utilisateur final, chacune avec un état de conversation indépendant
- Cycle de vie : Les Sessions persistent indéfiniment jusqu'à leur suppression via l'API. Pour les tâches ponctuelles sans stockage, utilisez
POST /messagesavecephemeral: true - Isolation entre plateformes : Les Sessions de l'API sont distinctes des conversations dans l'application web Jenova. Les Utilisateurs finaux, l'historique des Sessions et la Facturation sont indépendants entre l'API et l'application web.
Message
Une entrée unique dans l'historique de conversation d'une Session, renvoyée par les points de terminaison Messages. Chaque Message inclut un objet from structuré avec type ("user" ou "agent") et name, ainsi qu'un type de message :
external- un message de conversation destiné à être affiché comme contenu de chat.internal- un message facultatif représentant les étapes de travail de l'Agent pendant une Exécution, comme des appels d'Outils ou de la récupération.
Exécution
Une exécution unique de l'Agent créée lors de l'envoi d'un Message. Une Exécution possède un run_id, peut diffuser des Événements en continu pendant qu'elle est active, et produit un ou plusieurs Messages achevés. Chaque Session ne peut avoir qu'une seule Exécution active à la fois.
Utilisateur final
Le champ user associe les Sessions à un Utilisateur final dans votre application. Utilisez un ID opaque stable, tel que votre ID d'utilisateur interne ou un UUID. Évitez les adresses e-mail ou autres données personnelles sauf si votre application les exige. Les Sessions créées avec la même valeur user sont regroupées, ce qui permet le listage des Sessions par Utilisateur final.
Si user est omis, la Session est associée à votre compte développeur et ne pourra pas être filtrée ultérieurement par Utilisateur final. Transmettez user en production.
Pour les requêtes portant sur une Session existante, user est une protection de propriété facultative. Si vous le fournissez, il doit correspondre à la valeur user utilisée lors de la création de la Session ; dans le cas contraire, l'API renvoie 404 session_not_owned. Transmettez-le en paramètre de requête pour les requêtes GET et DELETE, et dans le corps JSON pour les requêtes POST et PATCH.
Authentification
Authentifiez chaque requête avec un Token Bearer dans l'en-tête Authorization :
Authorization: Bearer jnv_sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Les clés API sont générées à partir du tableau de bord développeur.
User-Agent est facultatif. Les SDK peuvent le définir à des fins de diagnostic, mais l'API ne l'exige pas.
Format de clé : Les clés commencent par le préfixe jnv_sk_ suivi d'une chaîne aléatoire encodée en base62.
Limites : Chaque compte développeur peut avoir jusqu'à 10 clés API actives.
Points de terminaison de l'API
Messages
L'envoi de Messages constitue le chemin principal de l'API. Utilisez POST /messages pour le premier message ; cela crée la session et démarre l'exécution en une seule requête. Utilisez POST /sessions/{session_id}/messages pour continuer une session_id déjà capturée.
Envoyer un Message
POST /messages
Crée une session persistante et envoie le premier message en une seule requête atomique. Définissez ephemeral: true pour une requête ponctuelle en diffusion continue sans stockage, qui ne stocke aucun historique de session ni de messages, ne renvoie aucun ID de session, et ne peut pas être poursuivie.
Corps de la requête
| Champ | Type | Obligatoire | Valeur par défaut | Description |
|---|---|---|---|---|
agent | string | Oui | - | L'identifiant slug de l'agent |
content | string | Conditionnel | - | Texte du message. Obligatoire sauf si file_urls est fourni |
file_urls | string[] | Conditionnel | - | URLs des fichiers à joindre. Obligatoire sauf si content est fourni |
user | string | Non | - | Votre identifiant d'utilisateur final externe (255 caractères maximum). Si omis, la valeur par défaut est votre compte développeur |
session_name | string | Non | - | Nom d'affichage de la nouvelle session (200 caractères maximum) |
ephemeral | boolean | Non | false | Requête ponctuelle sans stockage, en diffusion continue uniquement. Ne stocke aucun historique de session ni de messages, ne renvoie aucun ID de session, et ne peut pas être poursuivie |
stream | boolean | Non | true | true pour la diffusion en continu SSE, false pour du JSON. L'autorisation MCP requiert la diffusion en continu |
model | string | Non | - | Substitution ponctuelle du modèle pour cette requête uniquement. Utilisez un ID de modèle stable tel que claude-sonnet-5. Ne modifie pas le modèle par défaut de la session |
Exemple - Diffusion en continu (par défaut)
curl -N -X POST https://api.jenova.ai/v1/messages \
-H "Authorization: Bearer jnv_sk_xxx" \
-H "Content-Type: application/json" \
-d '{
"agent": "my-support-agent",
"user": "user_12345",
"content": "Hello, I need help with my account"
}'
La réponse est un flux SSE (voir Diffusion en continu (SSE) pour le format des événements). Les requêtes persistantes incluent le nouveau session_id ; les requêtes avec ephemeral: true omettent session_id et doivent utiliser la diffusion en continu.
Exemple - JSON (sans diffusion en continu)
curl -X POST https://api.jenova.ai/v1/messages \
-H "Authorization: Bearer jnv_sk_xxx" \
-H "Content-Type: application/json" \
-d '{
"agent": "my-support-agent",
"user": "user_12345",
"content": "Hello, I need help with my account",
"stream": false
}'
Réponse
Les réponses en diffusion continue émettent les événements SSE décrits dans Diffusion en continu (SSE). Les réponses sans diffusion en continu renvoient la structure JSON de message présentée dans Continuer la Session, incluant stop_reason et usage pour la requête terminée.
Si une exécution sans diffusion en continu est toujours en cours de traitement après 90 secondes, l'API renvoie 202 Accepted avec status: "processing", session_id, run_id, et message. L'exécution se poursuit après la réponse ou la déconnexion du client ; consultez les messages de la session, ou utilisez la diffusion en continu pour les workflows plus longs.
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 400 | missing_required_field | agent est obligatoire |
| 400 | invalid_payload | JSON malformé ou un champ a un type invalide |
| 400 | bad_request | Mode éphémère invalide, ou user/session_name dépasse sa longueur maximale |
| 400 | content_or_uploaded_files_required | Ni content ni file_urls fournis |
| 400 | content_too_long | Le contenu du message dépasse la longueur maximale de tokens |
| 400 | exceed_max_upload_files | Plus de 10 URLs de fichiers dans une seule requête |
| 400 | unsupported_file_format | Une URL de fichier a une extension de fichier non prise en charge |
| 400 | invalid_file_url | Une URL de fichier est malformée ou n'est pas en HTTPS |
| 400 | invalid_model_selection | La substitution de modèle n'est pas un modèle de production valide |
| 402 | insufficient_credits | Crédits insuffisants pour créer la session ou envoyer le message |
| 404 | agent_not_found | L'agent n'existe pas ou n'est pas accessible à votre compte |
Continuer la Session
POST /sessions/{session_id}/messages
Envoie un message à une Session persistante existante et reçoit la réponse de l'agent. Les réponses sont diffusées en continu via SSE par défaut ; définissez stream: false pour obtenir du JSON.
Corps de la requête
| Champ | Type | Obligatoire | Valeur par défaut | Description |
|---|---|---|---|---|
content | string | Conditionnel | - | Texte du message. Obligatoire sauf si file_urls est fourni |
file_urls | string[] | Conditionnel | - | URLs des fichiers à joindre. Obligatoire sauf si content est fourni |
stream | boolean | Non | true | true pour la diffusion en continu SSE, false pour du JSON. L'autorisation MCP nécessite la diffusion en continu |
model | string | Non | - | Remplacement ponctuel du modèle pour cette requête uniquement. Utilisez un ID de modèle stable tel que claude-sonnet-5. Ne modifie pas le modèle par défaut de la Session |
Exemple - Diffusion en continu (par défaut)
curl -N -X POST https://api.jenova.ai/v1/sessions/ses_abc123/messages \
-H "Authorization: Bearer jnv_sk_xxx" \
-H "Content-Type: application/json" \
-d '{
"content": "How do I reset my password?"
}'
Exemple - JSON (sans diffusion en continu)
curl -X POST https://api.jenova.ai/v1/sessions/ses_abc123/messages \
-H "Authorization: Bearer jnv_sk_xxx" \
-H "Content-Type: application/json" \
-d '{
"content": "How do I reset my password?",
"stream": false
}'
Réponse 200 OK
{
"id": "msg_xyz789",
"session_id": "ses_abc123",
"sequence": 4,
"from": {
"type": "agent",
"name": "my-support-agent"
},
"type": "external",
"time": "2026-05-19T10:31:05Z",
"content": "To reset your password, go to Settings > Security > Change Password...",
"model": "claude-sonnet-5",
"files": [],
"stop_reason": "end_run",
"usage": {
"cost": "0.0015"
}
}
Si la Session possède déjà une exécution active ou des messages en attente, l'API renvoie un JSON 202 Accepted avec status: "queued", session_id, run_id et message_id. Le Message de l'utilisateur est traité par l'exécution active.
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 400 | invalid_payload | JSON malformé ou un champ possède un type invalide |
| 400 | content_or_uploaded_files_required | Ni content ni file_urls n'ont été fournis |
| 400 | content_too_long | Le contenu du message dépasse la longueur maximale de tokens |
| 400 | exceed_max_upload_files | Plus de 10 URLs de fichiers dans une seule requête |
| 400 | unsupported_file_format | Une URL de fichier possède une extension de fichier non prise en charge |
| 400 | invalid_file_url | Une URL de fichier est malformée ou n'est pas en HTTPS |
| 400 | invalid_model_selection | Le remplacement de modèle n'est pas un modèle de production valide |
| 402 | insufficient_credits | Crédits insuffisants pour envoyer un message |
| 404 | session_not_found | La Session n'existe pas |
| 404 | session_not_owned | La Session appartient à un autre développeur ou ne correspond pas à l'utilisateur (user) fourni |
Idempotence
POST /messages et POST /sessions/{session_id}/messages acceptent un en-tête facultatif Idempotency-Key. Utilisez une clé unique pour chaque envoi logique de l'utilisateur afin que les nouvelles tentatives réseau ou les doubles soumissions ne créent pas d'exécutions dupliquées.
curl -N -X POST https://api.jenova.ai/v1/messages \
-H "Authorization: Bearer jnv_sk_xxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: send-user_12345-2026-05-19T10:30:00Z" \
-d '{
"agent": "my-support-agent",
"user": "user_12345",
"content": "Hello"
}'
Sans diffusion en continu : Une nouvelle tentative renvoie la réponse 200 ou 202 enregistrée avec l'en-tête Idempotent-Replayed: true.
Diffusion en continu : Le flux n'est pas rejoué. Une nouvelle tentative pendant l'exécution ou après son achèvement renvoie une erreur d'idempotence avec le run_id d'origine et, pour les requêtes persistantes, le session_id. Utilisez GET /sessions/{session_id}/runs/{run_id} pour vérifier une exécution active, ou GET /sessions/{session_id}/messages pour récupérer les résultats persistés.
Exemple de nouvelle tentative sur une diffusion en continu terminée :
HTTP/1.1 409 Conflict
Content-Type: application/json
{
"error": {
"code": "idempotency_key_reused",
"message": "This Idempotency-Key has already completed. Streaming responses cannot be replayed; use the returned session_id and run_id to retrieve the result."
},
"idempotency": {
"status": "completed",
"session_id": "ses_abc123",
"run_id": "run_abc123"
}
}
Erreurs d'idempotence
| Code d'état | Code | Condition |
|---|---|---|
| 409 | idempotency_key_reused | La même clé a été utilisée avec une requête différente |
| 409 | idempotency_key_in_use | La requête d'origine est toujours en cours d'exécution |
| 409 | idempotency_key_reused | La requête de diffusion en continu d'origine est déjà terminée et ne peut pas être rejouée |
Lister les Messages
GET /sessions/{session_id}/messages
Retourne une liste paginée des messages de conversation visibles. La première page contient les messages les plus récents ; au sein de chaque page, les messages sont classés par ordre chronologique (du plus ancien au plus récent). sequence est un numéro d'ordre stable au sein de la session.
Paramètres de requête
| Paramètre | Type | Valeur par défaut | Max | Description |
|---|---|---|---|---|
limit | integer | 20 | 100 | Messages par page |
cursor | string | - | - | Curseur de pagination |
Exemple
curl "https://api.jenova.ai/v1/sessions/ses_abc123/messages?limit=50" \
-H "Authorization: Bearer jnv_sk_xxx"
Réponse 200 OK
{
"items": [
{
"id": "msg_002",
"session_id": "ses_abc123",
"sequence": 4,
"from": {
"type": "agent",
"name": "my-support-agent"
},
"type": "external",
"time": "2026-05-19T10:31:05Z",
"content": "To reset your password, go to Settings > Security...",
"model": "claude-sonnet-5",
"files": []
}
],
"next_cursor": "",
"has_more": false
}
Objet Message
| Champ | Type | Description |
|---|---|---|
id | string | ID du message (préfixé par msg_) |
session_id | string | ID de la session parente |
sequence | integer | Numéro d'ordre stable au sein de la session |
from | object | Objet expéditeur avec type ("user" ou "agent") et name |
type | string | Type de message, généralement external pour les messages de conversation visibles |
time | string | Horodatage ISO 8601 |
content | string | Contenu textuel. Présent sur les messages externes |
model | string | ID stable du modèle ayant généré la réponse. Présent uniquement sur les messages d'agent |
files | array | Fichiers joints ou générés inclus avec le message. Chaque entrée comprend file_id, name, url, format et size lorsqu'ils sont connus |
stop_reason | string | Présent sur les messages d'agent terminés. La valeur actuelle est end_run |
agent | string | Slug de l'agent exécutant, lorsqu'il est disponible |
agent_name | string | Nom d'affichage de l'agent exécutant, lorsqu'il est disponible |
Objet Fichier
| Champ | Type | Description |
|---|---|---|
file_id | string | ID de fichier Jenova, lorsqu'il est disponible |
name | string | Nom du fichier |
url | string | URL du fichier, lorsqu'elle est disponible |
format | string | Format de fichier en minuscules, tel que pdf, png ou csv |
size | integer | Taille du fichier en octets, lorsqu'elle est connue |
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 400 | bad_request | Paramètre de requête invalide |
| 404 | session_not_found | La session n'existe pas |
| 404 | session_not_owned | La session appartient à un autre développeur ou ne correspond pas à l'user fourni |
Obtenir un Message
GET /sessions/{session_id}/messages/{message_id}
Récupère un message visible unique par son ID.
Réponse 200 OK
Retourne un objet message unique avec la même structure que la réponse de liste.
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 404 | session_not_found | La session n'existe pas |
| 404 | session_not_owned | La session appartient à un autre développeur ou ne correspond pas à l'user fourni |
| 404 | not_found | Le message n'existe pas dans cette session |
Pièces jointes
Fournissez des URL HTTPS accessibles publiquement dans le champ file_urls.
| Limite | Valeur |
|---|---|
| Nombre maximal de fichiers par message | 10 |
| Taille maximale de fichier | 20 Mo par fichier |
Formats pris en charge
- Images : JPG, JPEG, PNG, WebP
- Documents : PDF, DOCX, XLSX, PPTX, TXT, CSV, RTF, MD, HTML, XML, JSON, LOG
- Code : JS, TS, TSX, JSX, PY, Java, Go, C, CPP, H, HPP, CS, RB, PHP, RS, Swift, KT, Scala, SQL, CSS, YAML, YML
Lors du listage des messages, les fichiers joints apparaissent dans le tableau files du message.
Sessions
Les sessions sont des conversations persistantes entre un utilisateur final et un agent. La plupart des intégrations peuvent les créer implicitement avec POST /messages.
Créer une Session
POST /sessions
Crée une session persistante vide liée à un agent spécifique. Utilisez cette opération lorsque vous avez besoin d'un identifiant de session avant le premier message ; sinon, privilégiez POST /messages.
Remarque :
ephemeraln'est pas accepté surPOST /sessions; utilisezPOST /messagesavecephemeral: truepour les requêtes ponctuelles sans stockage.
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
agent | string | Oui | L'identifiant slug de l'agent |
user | string | Non | Votre identifiant d'utilisateur final externe (255 caractères max). S'il est omis, la valeur par défaut est votre compte développeur |
session_name | string | Non | Nom d'affichage de la session (200 caractères max) |
Exemple
curl -X POST https://api.jenova.ai/v1/sessions \
-H "Authorization: Bearer jnv_sk_xxx" \
-H "Content-Type: application/json" \
-d '{
"agent": "my-support-agent",
"user": "user_12345",
"session_name": "Billing inquiry"
}'
Réponse 201 Created
{
"id": "ses_abc123",
"session_name": "Billing inquiry",
"agent": "my-support-agent",
"user": "user_12345",
"model": "claude-sonnet-5",
"created_at": "2026-05-19T10:30:00Z",
"updated_at": "2026-05-19T10:30:00Z"
}
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 400 | invalid_payload | JSON mal formé ou champ ayant un type invalide |
| 400 | missing_required_field | agent est obligatoire |
| 400 | bad_request | ephemeral a été fourni, ou user/session_name dépasse sa longueur maximale |
| 402 | insufficient_credits | Crédits insuffisants pour créer une session |
| 404 | agent_not_found | L'agent n'existe pas ou n'est pas accessible à votre compte |
Lister les Sessions
GET /sessions
Retourne une liste paginée de vos sessions, triées par date de mise à jour la plus récente.
Paramètres de requête
| Paramètre | Type | Description |
|---|---|---|
limit | integer | Nombre d'éléments par page (valeur par défaut 20, max 100) |
cursor | string | Curseur de pagination |
user | string | Filtrer par identifiant d'utilisateur final (255 caractères max) |
agent | string | Filtrer par slug d'agent |
Exemple
curl "https://api.jenova.ai/v1/sessions?user=user_12345&limit=10" \
-H "Authorization: Bearer jnv_sk_xxx"
Réponse 200 OK
{
"items": [
{
"id": "ses_abc123",
"session_name": "Billing inquiry",
"agent": "my-support-agent",
"user": "user_12345",
"model": "claude-sonnet-5",
"created_at": "2026-05-19T10:30:00Z",
"updated_at": "2026-05-19T11:15:00Z"
}
],
"next_cursor": "eyJ2IjoxLCJrIjoiY3VyXzAxIn0",
"has_more": true
}
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 400 | bad_request | Paramètre de requête invalide |
Obtenir une Session
GET /sessions/{session_id}
Récupère une session unique par son identifiant.
Réponse 200 OK
Retourne un objet session ayant la même structure que la réponse de création.
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 404 | session_not_found | La session n'existe pas |
| 404 | session_not_owned | La session appartient à un autre développeur ou ne correspond pas au user fourni |
Renommer la Session
PATCH /sessions/{session_id}
Met à jour le nom d'affichage d'une session.
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
session_name | string | Oui | Nouveau nom d'affichage (200 caractères maximum) |
Réponse 200 OK
Retourne l'objet session mis à jour.
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 400 | invalid_payload | JSON malformé ou un champ possède un type invalide |
| 400 | missing_required_field | session_name est requis |
| 400 | bad_request | session_name dépasse sa longueur maximale |
| 404 | session_not_found | La session n'existe pas |
| 404 | session_not_owned | La session appartient à un autre développeur ou ne correspond pas au user fourni |
Supprimer la Session
DELETE /sessions/{session_id}
Supprime définitivement une session et tous ses messages. La session ne doit pas avoir d'exécution active.
Réponse 204 No Content
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 404 | session_not_found | La session n'existe pas |
| 404 | session_not_owned | La session appartient à un autre développeur ou ne correspond pas au user fourni |
| 409 | busy | La session a une exécution active - annulez-la d'abord |
Opérations
Ces points de terminaison sont des contrôles de récupération et d'édition pour les sessions persistantes. La plupart des intégrations n'ont besoin que d'Annuler ; utilisez les autres opérations lorsque vous souhaitez intentionnellement modifier ou récupérer l'état d'une session. Toutes les opérations prennent en charge le mécanisme de contrôle de propriété facultatif user décrit dans Utilisateur final.
Annuler l'Exécution active
POST /sessions/{session_id}/cancel
Annule l'exécution d'agent en cours. Cela ne supprime pas les messages déjà terminés avant l'annulation.
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
run_id | string | Non | Garde-fou facultatif pour exécution obsolète. S'il est fourni et ne correspond pas à l'exécution active, l'API retourne 409 stale_run |
Réponse 204 No Content
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 400 | cancel_not_allowed | Aucune exécution active à annuler, ou annulation non autorisée |
| 404 | session_not_found | La session n'existe pas |
| 404 | session_not_owned | La session appartient à un autre développeur ou ne correspond pas au user fourni |
| 409 | stale_run | Le run_id fourni ne correspond pas à l'exécution active |
Défaire l'Exécution active
POST /sessions/{session_id}/undo
Annule l'exécution active, attend son arrêt, puis supprime tous les messages qu'elle avait déjà ajoutés. Aucune sortie supplémentaire n'est conservée après l'émission de la commande « Défaire ».
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
run_id | string | Non | Garde-fou facultatif pour exécution obsolète. S'il est fourni et ne correspond pas à l'exécution active, l'API retourne 409 stale_run |
Réponse 200 OK
{
"session_id": "ses_abc123",
"run_id": "run_abc123",
"deleted": ["msg_002", "msg_001"]
}
Si l'exécution est annulée avant qu'aucun message ne soit terminé, deleted est un tableau vide.
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 400 | cancel_not_allowed | Aucune exécution active à annuler, ou annulation non autorisée |
| 404 | session_not_found | La session n'existe pas |
| 404 | session_not_owned | La session appartient à un autre développeur ou ne correspond pas au user fourni |
| 409 | stale_run | Le run_id fourni ne correspond pas à l'exécution active |
| 409 | busy | La session est temporairement indisponible car une autre mise à jour est en cours |
Supprimer les Messages récents
POST /sessions/{session_id}/messages/delete
Supprime les N Messages les plus récents d'une Session inactive. La Session ne doit pas avoir d'Exécution active.
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
count | integer | Oui | Nombre de Messages récents à supprimer à partir de la fin (doit être supérieur à 0) |
Réponse 200 OK
{
"deleted": ["msg_002", "msg_001"]
}
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 400 | bad_request | count manquant, égal à zéro ou négatif ; ou aucun Message à supprimer |
| 404 | session_not_found | La Session n'existe pas |
| 404 | session_not_owned | La Session appartient à un autre développeur ou ne correspond pas à l'user fourni |
| 409 | busy | La Session a une Exécution active |
Dupliquer la Session (Fork)
POST /sessions/{session_id}/fork
Crée une nouvelle Session en copiant la Session source jusqu'à un Message spécifique. La Session source ne doit pas avoir d'Exécution active.
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
message_id | string | Non | ID du Message servant de point de duplication. S'il est omis, la duplication s'effectue à partir du dernier Message |
Réponse 201 Created
Retourne l'objet de la Session nouvellement créée, avec la même structure que celle utilisée lors de la création d'une Session.
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 400 | bad_request | message_id est invalide |
| 402 | insufficient_credits | Crédits insuffisants pour dupliquer une Session |
| 404 | not_found | message_id n'existe pas dans cette Session |
| 404 | session_not_found | La Session n'existe pas |
| 404 | session_not_owned | La Session appartient à un autre développeur ou ne correspond pas à l'user fourni |
| 409 | busy | La Session source a une Exécution active |
Obtenir l'état de l'Exécution
GET /sessions/{session_id}/runs/{run_id}
Retourne l'état actuel d'une Exécution active. Utilisez cette opération après une connexion SSE interrompue ou une réponse d'idempotence ayant renvoyé un run_id. Une fois l'Exécution terminée, récupérez les résultats via GET /sessions/{session_id}/messages.
Réponse 200 OK
{
"session_id": "ses_abc123",
"run_id": "run_abc123",
"status": "streaming",
"started_at": "2026-05-19T10:30:00Z",
"updated_at": "2026-05-19T10:30:06Z",
"content": "Partial visible response text so far"
}
La réponse peut également inclure des indications de progression récentes tant que l'Exécution est active.
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 400 | bad_request | La Session est éphémère |
| 404 | session_not_found | La Session n'existe pas |
| 404 | session_not_owned | La Session appartient à un autre développeur ou ne correspond pas à l'user fourni |
| 404 | not_found | L'Exécution n'est pas active pour cette Session |
Crédits
Obtenir le solde
GET /credits/balance
Retourne votre solde de Crédits actuel.
Réponse 200 OK
{
"balance": "123.45"
}
Agents
Créez et modifiez des Agents personnalisés dans le Tableau de bord. La prise en charge de la création et de la modification d'Agents via l'API arrive prochainement.
Les flux de travail planifiés/en arrière-plan ne sont actuellement pas pris en charge via l'API. Le Support arrive prochainement.
Lister les Agents
GET /agents
Retourne les agents disponibles pour votre Clé API. Utilisez la valeur agent lors de la création de sessions ou de l'envoi de messages.
Réponse 200 OK
{
"agents": [
{
"agent": "jenova",
"display_name": "Jenova",
"description": "General-purpose Jenova agent"
},
{
"agent": "my-support-agent",
"display_name": "Support Agent",
"description": "Answers customer questions"
}
]
}
| Champ | Type | Description |
|---|---|---|
agent | string | Slug stable de l'agent à transmettre comme valeur agent |
display_name | string | Nom d'affichage lisible par un humain |
description | string | Description de l'agent |
Modèles
Lister les Modèles
GET /models
Retourne tous les modèles disponibles pour une utilisation dans le champ model lors de l'envoi de messages.
Réponse 200 OK
{
"models": [
{
"id": "claude-opus-4-8",
"name": "Claude Opus 4.8",
"thinking_variant": "claude-opus-4-8-thinking"
},
{
"id": "claude-opus-4-8-thinking",
"name": "Claude Opus 4.8 (Thinking)"
},
{
"id": "kimi-k2.6",
"name": "Kimi K2.6",
"thinking_variant": "kimi-k2.6-thinking"
}
]
}
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant stable du modèle. À transmettre comme valeur model dans Send Message |
name | string | Nom d'affichage lisible par un humain |
thinking_variant | string | ID du modèle correspondant à la variante avec raisonnement étendu. Présent uniquement sur les modèles de base prenant en charge le raisonnement |
Les modèles disposant d'un thinking_variant prennent en charge le raisonnement étendu. Utilisez directement l'ID de la variante dans le champ model pour l'activer.
Si aucun model n'est spécifié lors de l'envoi d'un message, le modèle par défaut de l'agent est utilisé.
Documentation
GET /docs?lang=en
GET /doc?lang=en
Retourne cette référence au format Markdown. Utilisez lang pour sélectionner la langue.
Diffusion en continu (SSE)
Lorsque stream est omis ou vaut true (valeur par défaut), les réponses aux messages sont livrées sous forme de Server-Sent Events. Utilisez les Événements message_completed pour identifier les messages prêts à être récupérés ou affichés.
Délai d'expiration : les connexions SSE restent ouvertes pendant 60 minutes maximum. Les requêtes non diffusées en continu attendent jusqu'à 90 secondes, puis retournent 202 Accepted tandis que l'exécution se poursuit.
En-têtes de connexion
La réponse SSE définit les en-têtes suivants :
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
X-Accel-Buffering: no
X-Run-Id: run_abc123
X-Run-Id est disponible avant le premier Événement SSE.
Reconnexion et récupération
Les flux SSE ne sont pas rejoués. Si la connexion est interrompue, utilisez le session_id et le run_id capturés pour récupérer l'état :
curl "https://api.jenova.ai/v1/sessions/ses_abc123/runs/run_abc123" \
-H "Authorization: Bearer jnv_sk_xxx"
Si l'exécution est toujours active, cela retourne le statut actuel, le texte partiel et la progression récente. Si la réponse est 404 not_found, l'exécution n'est plus active ; récupérez les messages de la session pour reconstituer la sortie terminée :
curl "https://api.jenova.ai/v1/sessions/ses_abc123/messages?limit=20" \
-H "Authorization: Bearer jnv_sk_xxx"
Format des trames
Chaque trame SSE suit le format standard :
event: <event_type>
data: <json_payload>
Deux retours à la ligne terminent chaque trame.
Types d'Événements
Les flux incluent des événements de cycle de vie, delta de texte, réflexion, progression, avertissement, achèvement de message, connexion MCP, erreur, final et ping. Certains types d’événements ne sont envoyés que lorsqu’ils sont pertinents.
Pour les requêtes éphémères (ephemeral: true), chaque Événement SSE omet session_id. Utilisez uniquement run_id pour corréler les Événements à l'intérieur de ce flux unique.
Pour la réconciliation finale sur les requêtes persistantes, attendez l'Événement stream_ended, puis appelez List Messages.
Champs communs des Événements liés à une Exécution :
| Champ | Description |
|---|---|
session_id | ID de Session. Omis pour les flux éphémères. Récupérez cette valeur depuis stream_started pour les requêtes de suivi lors de l'utilisation de POST /messages en mode persistant |
run_id | ID de l'Exécution en cours, lorsqu'il est disponible |
stream_started
Envoyé une fois au démarrage de l'Exécution.
| Champ | Description |
|---|---|
agent | Slug de l'Agent de la Session, lorsqu'il est disponible |
stream_delta
Envoyé de manière répétée au fur et à mesure que l'Agent génère le texte de réponse visible. Concaténez les valeurs de chunk_content dans l'ordre de seq pour reconstituer la réponse diffusée en continu.
event: stream_delta
data: {"session_id":"ses_abc123","run_id":"run_abc123","chunk_content":"To reset your ","seq":1}
| Champ | Description |
|---|---|
chunk_content | Fragment de texte |
seq | Numéro de séquence monotone du fragment au sein du flux |
stream_thinking
Envoyé de manière répétée pendant que l'Agent émet une sortie de réflexion. Utilisez cet Événement pour un indicateur de réflexion distinct ou une vue de trace ; ne le concaténez pas dans le texte de réponse final.
| Champ | Description |
|---|---|
content | Fragment de texte de réflexion |
stream_progress
Signale une activité visible par l’utilisateur pendant la génération, par exemple la lecture d’un document, la recherche sur le web ou l’attente d’une action utilisateur. Ces événements sont destinés à un affichage temporaire dans l’interface ; ignorez les champs inconnus. Utilisez les messages terminés comme historique de messages faisant autorité.
Avancé : les requêtes de Message acceptent include_progress: false pour omettre uniquement stream_progress. Les Événements de cycle de vie, ping, message_completed, les erreurs et les Événements terminaux sont toujours envoyés lorsque cela est pertinent.
| Champ | Description |
|---|---|
state | État du cycle de vie : running, in-progress, success, failed, skipped, complete, cancelled, entre autres. Gérez les valeurs inconnues de manière robuste |
label | Libellé d'activité lisible par un humain |
Certains Événements de progression peuvent inclure url, file_name ou server_name comme indices d'affichage facultatifs.
message_completed
Envoyé chaque fois qu'un Message est complet et prêt à être récupéré ou affiché.
Ceci est un marqueur de délimitation, pas l'objet Message complet. Récupérez le Message si vous avez besoin de son contenu ou de ses métadonnées.
event: message_completed
data: {"session_id":"ses_abc123","run_id":"run_abc123","message_id":"msg_abc123","sequence":4,"from":{"type":"agent","name":"Jenova"},"type":"external"}
| Champ | Description |
|---|---|
message_id | ID du Message complété |
sequence | Numéro d'ordre stable au sein de la Session |
from | Objet expéditeur avec type (user ou agent) et name |
type | Type de Message : external ou internal |
mcp_connection
Envoyé lorsque l’agent a besoin que l’utilisateur final connecte ou autorise un ou plusieurs serveurs MCP avant de pouvoir continuer. Cet événement est uniquement disponible en mode streaming.
| Champ | Description |
|---|---|
connection_server_list | Serveurs MCP nécessitant une action de connexion. Chaque serveur inclut mcp_server_id, mcp_server_name et éventuellement auth_url |
user_action_deadline_unix | Horodatage Unix auquel l’action utilisateur de connexion expire |
mcp_connection_resolved
Envoyé lorsque l’action utilisateur de connexion MCP a été résolue ou a expiré.
Aucun champ supplémentaire en dehors des champs communs liés à l'Exécution.
warning
Envoyé pour des avertissements non fatals survenus pendant une Exécution.
| Champ | Description |
|---|---|
message | Avertissement non fatal lisible par un humain |
code | Code d'avertissement facultatif |
stream_error
Envoyé lorsqu'une Exécution échoue. Un Événement final stream_ended peut suivre avec success:false et stop_reason:"error".
| Champ | Description |
|---|---|
code | Code d'erreur |
message | Message d'erreur lisible par un humain |
stream_ended
Envoyé une seule fois lorsque l'exécution se termine. Il s'agit de l'événement final du flux.
event: stream_ended
data: {"session_id":"ses_abc123","run_id":"run_abc123","success":true,"stop_reason":"end_run","usage":{"cost":"0.0032"}}
Exemple d'échec :
event: stream_ended
data: {"session_id":"ses_abc123","run_id":"run_abc123","success":false,"stop_reason":"user_cancelled","usage":{"cost":"0.0012"}}
| Champ | Description |
|---|---|
success | Indique si l'exécution s'est terminée avec succès |
stop_reason | Motif de fin d’exécution : end_run, user_cancelled, user_action_timeout, ou error |
usage | Objet d'utilisation pour cette requête. Inclut actuellement cost lorsqu'il est disponible |
ping
Trames de maintien de connexion envoyées toutes les 15 secondes pour éviter les délais d'expiration des proxys/CDN. Ignorez-les dans votre client.
Intégration du serveur MCP
Connectez vos Agents à des Outils externes via le Model Context Protocol (MCP) :
- Serveurs MCP gérés par Jenova : serveurs hébergés par Jenova pour la recherche, la récupération de contenu, la génération de documents et d'autres fonctionnalités intégrées
- Serveurs MCP distants : autres serveurs MCP distants configurés pour votre Agent
Les serveurs MCP doivent être configurés dans le tableau de bord lors de la création ou de la modification de votre Agent. Pour utiliser votre propre serveur MCP, ajoutez-le à un Agent personnalisé, puis appelez cet Agent via l'API. L'API exécute les Outils activés dans la configuration de l'Agent ; aucune configuration supplémentaire n'est requise dans les requêtes API.
Lorsqu'un Agent utilise des Outils MCP au cours d'une réponse, des Événements de progression sont envoyés dans le flux à mesure qu'ils se produisent :
event: stream_progress
data: {"session_id":"ses_...","run_id":"run_...","state":"running","label":"Searching Google"}
Si l’agent a besoin que l’utilisateur final se connecte à un serveur MCP ou l’autorise pendant l’exécution, les réponses en streaming peuvent inclure les événements mcp_connection et mcp_connection_resolved. Présentez la liste des serveurs à connecter à votre utilisateur final et ouvrez l’auth_url fournie lorsqu’elle est présente. Gardez le flux SSE ouvert pendant que l’utilisateur connecte ou autorise le serveur.
Après l'autorisation, Jenova stocke le Token, la fenêtre d'autorisation affiche une page de confirmation, et la même Exécution se poursuit automatiquement. L'Utilisateur final n'a pas besoin de renvoyer le Message.
Si l’utilisateur final ne se connecte pas, n’autorise pas, n’ignore pas ou ne met pas en sourdine avant user_action_deadline_unix, l’exécution se termine avec stop_reason:"user_action_timeout". Vous pouvez également annuler l’exécution active avec POST /sessions/{session_id}/cancel.
Stockez l’auth_url côté client. Si le client se déconnecte pendant l’autorisation, l’URL reste valide jusqu’à user_action_deadline_unix. Pour les requêtes persistantes, reconnectez-vous via Get Run Status, ou récupérez les messages une fois l’exécution terminée.
Les requêtes non streaming (stream: false) ne prennent pas en charge les actions utilisateur de connexion MCP ; utilisez le streaming pour les agents qui peuvent nécessiter cette interaction.
Ignorer la connexion MCP
POST /sessions/{session_id}/mcp/connection/skip
Ignore une action utilisateur de connexion MCP en attente et permet à l’exécution de continuer sans cette connexion.
Pour mettre en sourdine les futures demandes de connexion pour un serveur pour le même utilisateur de l’API, incluez mcp_server_id et mute. Les valeurs prises en charge sont 24h et forever.
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
run_id | string | Oui | ID de l’exécution active provenant de l’événement mcp_connection |
mcp_server_id | string | Non | Requis avec mute ; utilisez le mcp_server_id provenant de l’événement |
mute | string | Non | 24h ou forever |
Réponse 204 No Content
Le flux émet mcp_connection_resolved, puis l’exécution se poursuit avec le même run_id.
Erreurs
| Statut | Code | Condition |
|---|---|---|
| 400 | bad_request | run_id manquant, aucune exécution active, ou aucune connexion MCP à ignorer |
| 400 | bad_request | mute invalide, ou mcp_server_id manquant alors que mute est défini |
| 404 | session_not_found | La Session n'existe pas |
| 404 | session_not_owned | Ne correspond pas à l'user fourni |
| 409 | stale_run | run_id ne correspond pas à l'Exécution active |
Facturation
Tous les Coûts sont déduits de votre solde de Crédits développeur. Consultez l'Utilisation et rechargez des Crédits sur www.jenova.ai/platform.
Tarification
| Opération | Coût |
|---|---|
| Create Session | 0,01 $ fixe pour chaque Session persistante, y compris les Sessions créées implicitement par POST /messages |
| Fork Session | 0,05 $ fixe |
| Send Message | Variable (voir ci-dessous) |
Le Coût d'un Message dépend :
- du Modèle - les Coûts par token varient selon les Modèles
- de la longueur du contexte - les Sessions plus longues consomment davantage de tokens d'entrée par requête
- de la complexité du workflow - des workflows plus longs et une utilisation plus intensive des Outils (recherche web, génération de fichiers, analyse de documents) augmentent la consommation totale de tokens
Le Coût réel est renvoyé dans stream_ended.usage.cost pour les requêtes en Diffusion en continu et dans usage.cost pour les requêtes JSON non-Diffusion en continu.
Retenues de crédits
Chaque nouvelle Exécution de Message place une retenue de 0,50 $ sur votre solde de Crédits avant le début de l'exécution. Cela réserve des fonds pour l'Exécution. Les Messages de suivi mis en file d'attente dans une Exécution active ne créent pas de retenues supplémentaires ; l'Utilisation de l'Exécution active est vérifiée par rapport à votre solde restant.
Lorsque l'Exécution se termine, la retenue est ajustée au Coût réel et la différence est libérée. Les Exécutions annulées et échouées ne sont facturées que pour l'Utilisation déjà engagée. Si une requête échoue avant d'atteindre le Modèle, la retenue complète est libérée.
Cela signifie que votre solde disponible peut temporairement paraître inférieur pendant les requêtes en cours. Vous devez disposer d'au moins 0,50 $ de solde disponible pour envoyer un Message à une Session existante ou pour envoyer un Message éphémère. Une première requête POST /messages persistante crée une Session et nécessite au moins 0,51 $ pour couvrir la retenue du Message ainsi que les frais de création de Session.
Limites de débit
Chaque compte développeur est soumis à trois dimensions de limite de débit :
| Dimension | Valeur par défaut | Description |
|---|---|---|
| RPM (Requêtes par minute) | 60 | Fenêtre fixe par minute |
| RPD (Requêtes par jour) | 1 000 | Fenêtre fixe par jour |
| Concurrentes | 5 | Nombre maximal de requêtes simultanées en cours |
Les requêtes GET et HEAD ne consomment pas d’emplacements concurrents. cancel, undo et mcp/connection/skip ne consomment pas non plus d’emplacements concurrents ; ces opérations restent donc disponibles lorsque tous les emplacements sont utilisés. Ces requêtes comptent toujours dans le RPM et le RPD.
En-têtes de réponse
Les réponses de l'API authentifiées incluent des en-têtes de limite de débit :
| En-tête | Description |
|---|---|
X-RateLimit-Limit | Votre limite RPM |
X-RateLimit-Remaining | Nombre de requêtes restantes dans la fenêtre de la minute en cours |
X-RateLimit-Reset | Horodatage Unix de la réinitialisation de la fenêtre en cours |
Retry-After | Nombre de secondes à attendre avant de retenter (uniquement en cas de 429) |
Lorsqu'une limite est dépassée, l'API retourne 429 Too Many Requests :
{
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Please retry after 12 seconds."
}
}
Gestion des erreurs
Les erreurs HTTP immédiates et les erreurs d'exécution non diffusées en continu suivent une enveloppe cohérente :
{
"error": {
"code": "error_code_string",
"message": "Human-readable description"
}
}
Les messages d'erreur sont localisés en fonction du paramètre lang (voir Localisation).
Les erreurs d'exécution en diffusion continue sont transmises sous forme d'Événements stream_error. Une Exécution ayant échoué peut néanmoins envoyer un Événement final stream_ended avec success:false et stop_reason défini. Les erreurs d'exécution non diffusées en continu peuvent également inclure un objet usage de premier niveau lorsque les données de coût sont disponibles.
Les erreurs spécifiques à chaque point de terminaison sont documentées directement sous chaque point de terminaison.
Erreurs d'Exécution après le démarrage
Les erreurs d'Exécution apparaissent après le démarrage d'une exécution de message. En mode diffusion en continu, elles apparaissent sous forme d'Événements stream_error et peuvent être suivies d'un stream_ended avec success:false. En mode non diffusé en continu, elles sont renvoyées sous forme de réponse d'erreur JSON avec le code d'état HTTP ci-dessous.
| Code d'état HTTP (non diffusé en continu) | Code | Description |
|---|---|---|
| 400 | content_policy_violation | Le fournisseur du modèle a rejeté la requête pour des raisons de politique de contenu |
| 404 | session_not_found | La Session a été supprimée avant que l'Exécution ne puisse s'exécuter |
| 409 | busy | La Session est devenue occupée ou temporairement indisponible avant que l'Exécution ne puisse démarrer |
| 413 | total_image_size_exceeded | La taille combinée des images dépasse la limite de taille par requête du Modèle |
| 500 | internal_error | Échec inattendu de l'Exécution |
| 502 | llm_api_error | Erreur de l'API du fournisseur de modèle ou du modèle en amont |
Pagination
Les points de terminaison de liste utilisent une pagination basée sur un curseur :
{
"items": [],
"next_cursor": "eyJ2IjoxLCJrIjoiY3VyXzAyIn0",
"has_more": true
}
| Paramètre | Type | Valeur par défaut | Max | Description |
|---|---|---|---|---|
limit | integer | 20 | 100 | Nombre d'éléments par page |
cursor | string | - | - | Curseur opaque provenant d'un next_cursor précédent |
Transmettez next_cursor en tant que paramètre de requête cursor pour récupérer la page suivante. Lorsque has_more vaut false, il n'y a plus de résultats.
Localisation
Tous les points de terminaison acceptent un paramètre de requête facultatif lang permettant de contrôler la langue des messages d'erreur et de tout contenu localisé.
| Source | Priorité | Exemple |
|---|---|---|
Paramètre de requête lang | La plus élevée | ?lang=zh |
En-tête Accept-Language | Repli | Accept-Language: ja |
| Valeur par défaut | La plus basse | Anglais (en) |
Vous pouvez ajouter ?lang=xx à n'importe quelle URL de requête :
POST /sessions?lang=zh
GET /sessions/ses_abc123/messages?lang=ja
Langues prises en charge : en, zh, ja, ko, es, fr, de, it, pt, ru, id, th, vi
Confidentialité et données
Jenova n'utilise pas les invites, les résultats, l'historique des conversations, les fichiers téléversés, les instructions d'Agent ni les Bases de connaissances issus de l'API pour entraîner les Modèles Jenova.
Pour les fournisseurs de modèles tiers, Jenova utilise des canaux d'API commerciaux, des paramètres de compte, des engagements contractuels ou des mécanismes de retrait destinés à empêcher que le contenu des clients soit utilisé pour entraîner les modèles des fournisseurs.
Jenova stocke et traite les données de l'API à l'aide d'une infrastructure basée aux États-Unis. Les fournisseurs tiers peuvent traiter les données dans d'autres juridictions, comme décrit dans la Politique de confidentialité et les Conditions d'utilisation.
Pour plus de détails, consultez les Conditions d'utilisation, la Politique de confidentialité et la Politique d'utilisation.
Support
- Tableau de bord : www.jenova.ai/platform
- E-mail : [email protected]