L’API HTTPS
Tout ce que font les bibliothèques passe par cette API : du JSON sur HTTPS, utilisable depuis n'importe quel langage. Les méthodes de MongoDB y ont chacune leur adresse (…/collections/patients:find), avec les mêmes arguments que dans le pilote.
L'adresse
https://votre-ished.example/v1/… parle au premier cluster du projet ; https://votre-ished.example/v1/clusters/<nom>/… à un cluster nommé. L'adresse exacte est dans la console (Vue d'ensemble › « Obtenir l'adresse de connexion »). GET /v1/health répond { "ok": true } sans clé : il dit seulement que le service répond.
L'authentification
Chaque requête porte une clé du projet :
curl -H "Authorization: Bearer $ISHED_KEY" "$ISHED_URL/v1/bases"La clé n'est acceptée que depuis une adresse IP autorisée du projet, et seulement en HTTPS. Son rôle borne ce qu'elle peut faire : lecture, écriture (lire et écrire), administration (en plus : définitions, import, journal). Une clé limitée à certaines bases ou collections ne voit que celles-là.
Les requêtes et les réponses
Les corps sont en JSON (Content-Type: application/json), 2 Mo au plus (16 Mo pour un import). Trois types que JSON n'a pas s'écrivent ainsi, dans les deux sens :
| Valeur | En JSON |
|---|---|
| une date | {"~date": "2026-11-12T08:00:00.000Z"} |
| un entier au-delà de 2^53 | {"~int": "9007199254740993"} |
| des octets | {"~bytes": "<base64>"} |
const ajout = await fetch(`${process.env.ISHED_URL}/v1/bases/Clinique/collections/visites:insertOne`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.ISHED_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ document: { patient: 'awa', le: { '~date': '2026-11-12T08:00:00.000Z' } } }),
});
console.log(ajout.status, await ajout.json()); // 201 { acknowledged: true, insertedId: '…' }
const trouves = await fetch(`${process.env.ISHED_URL}/v1/bases/Clinique/collections/visites:find`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.ISHED_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ filter: { patient: 'awa' }, sort: { le: -1 }, limit: 10 }),
});
const { documents } = await trouves.json();
console.log(documents[0].le); // { '~date': '2026-11-12T08:00:00.000Z' }Les lectures rendent 1000 documents au plus par réponse ; la suite se demande avec le nextPageToken reçu.
Avec Postman
Toute l'API est dans une collection Postman, avec son environnement : une requête par adresse, dans un ordre qui se joue du début à la fin. Importez les deux fichiers (Import, puis déposez-les), choisissez l'environnement « IshedDB », mettez l'adresse de votre cluster dans baseUrl et votre clé dans ishedKey (une variable secrète). Jouée en entier avec le Runner, la collection crée la collection rendezvous_postman dans la base Essais et la supprime à la fin ; il lui faut une clé d'administration. Nos tests la jouent en entier contre un vrai serveur IshedDB à chaque version.
La collection ne contient aucune clé. Utilisez l'application de bureau de Postman : avec son agent dans le nuage, vos requêtes et votre clé passent par les serveurs de Postman, depuis une adresse IP qui n'est pas la vôtre.
Les erreurs
Un refus répond un statut HTTP et { "error": { "code", "message", "requestId" } } (et parfois details, par exemple les champs refusés). Donnez le requestId à l'assistance : il retrouve la requête dans nos journaux.
| Statut | code | Quand |
|---|---|---|
| 400 | invalid-argument | un argument ou un document refusé (le message dit lequel et pourquoi) |
| 401 | unauthenticated | aucune clé, ou une clé inconnue, révoquée ou expirée |
| 403 | permission-denied | une adresse IP non autorisée, ou une clé dont le rôle ne suffit pas |
| 404 | not-found | un document, une collection ou un cluster qui n'existe pas |
| 409 | already-exists, aborted | un identifiant ou une valeur unique déjà pris ; une transaction en conflit |
| 412 | failed-precondition | une opération impossible dans l'état présent |
| 413 | payload-too-large | un corps trop lourd |
| 429 | resource-exhausted | le stockage ou le rythme du palier atteint : réessayez plus tard |
| 504 | deadline-exceeded | une requête trop longue |
Les adresses
| Méthode | Adresse | Clé | Ce qu’elle fait |
|---|---|---|---|
GET | /v1/bases | lecture | Les bases du cluster : nom, taille sur disque, vide ou non, et la taille totale (une clé limitée : ses bases). |
GET | /v1/bases/{base}/collections | lecture | Les collections et les vues d’une base, avec leur nombre de documents. |
POST | /v1/bases/{base}:runCommand | lecture | Une commande de MongoDB sur la base : create, collMod, drop, explain (la clé que demande la commande). |
POST | /v1/bases/{base}:watch | lecture | Les changements de toute la base, comme un change stream (réponse dès qu’il y en a, 20 s d’attente au plus). |
POST | /v1:watch | lecture | Les changements de tout le cluster. |
GET | /v1/bases/{base}/collections/{collection}/definition | lecture | La définition d’une collection : champs, uniques, index, expiration, validation. |
PUT | /v1/bases/{base}/collections/{collection}/definition | administration | Pose la définition d’une collection (corps : { definition }). |
POST | /v1/bases/{base}/collections/{collection}/documents | écriture | Ajoute un document (corps : { data }, et { id } pour le choisir) ; répond le document avec son identifiant. |
GET | /v1/bases/{base}/collections/{collection}/documents/{id} | lecture | Lit un document ; ?reveal=champ pour un champ caché, ?select=a,b pour certains champs. |
PUT | /v1/bases/{base}/collections/{collection}/documents/{id} | écriture | Remplace un document, ou le crée (corps : { data }). |
PATCH | /v1/bases/{base}/collections/{collection}/documents/{id} | écriture | Modifie des champs d’un document (corps : { changes }, avec les valeurs spéciales ~increment, ~remove…). |
DELETE | /v1/bases/{base}/collections/{collection}/documents/{id} | écriture | Supprime un document. |
POST | /v1/bases/{base}/collections/{collection}:query | lecture | Les documents d’une requête dans la syntaxe d’IshedDB : where, orderBy, limit, offset, select, pageToken. |
POST | /v1/bases/{base}/collections/{collection}:count | lecture | Le nombre de documents d’une requête (where). |
POST | /v1/bases/{base}/collections/{collection}:estimate | lecture | Le nombre de documents de la collection, aussitôt. |
POST | /v1:beginTransaction | lecture | Ouvre une transaction (60 s au plus, 20 s sans requête) ; répond son identifiant, à donner dans l’en-tête X-Ished-Transaction. |
POST | /v1:commit | lecture | Valide une transaction : tout ce qu’elle a écrit, ou rien. |
POST | /v1:rollback | lecture | Abandonne une transaction. |
POST | /v1/bases/{base}/collections/{collection}:updateAll | écriture | Modifie tous les documents d’une requête (corps : { where, changes }). |
POST | /v1/bases/{base}/collections/{collection}:exists | lecture | Si au moins un document répond à la requête. |
POST | /v1/bases/{base}/collections/{collection}:countBy | lecture | Le nombre de documents par valeur d’un champ (corps : { path, where, order, limit }). |
POST | /v1/bases/{base}/collections/{collection}:updateFirst | écriture | Modifie le premier document d’une requête, ou le crée ({ create: true }). |
POST | /v1/bases/{base}/collections/{collection}:deleteWhere | écriture | Supprime les documents d’une requête (ou le premier, { first: true }). |
POST | /v1/bases/{base}/collections/{collection}:import | administration | Importe des documents tels qu’ils sont, identifiants gardés (1000 par appel). |
GET | /v1/audit | administration | Le journal des accès du cluster (?limit=, 1000 au plus) : qui a lu ou écrit quoi, jamais une valeur. |
GET | /v1/audit:verify | administration | Vérifie la chaîne du journal : une ligne retirée ou changée se voit. |
POST | /v1/bases/{base}/collections/{collection}:create | écriture | Comme db.createCollection : une collection vide (avec validator), ou une vue (viewOn, pipeline). |
POST | /v1/bases/{base}/collections/{collection}:collMod | écriture | Comme collMod : change une vue ou les règles de validation. |
POST | /v1/bases/{base}/collections/{collection}:drop | écriture | Supprime la collection et ses documents, ou la vue. |
POST | /v1/bases/{base}/collections/{collection}:explain | lecture | Le plan d’un find, d’un aggregate, d’un count ou d’un distinct (verbosity). |
POST | /v1/bases/{base}/collections/{collection}:find | lecture | Comme find : filter, sort, projection, limit, skip ; 1000 documents par page, puis nextPageToken. |
POST | /v1/bases/{base}/collections/{collection}:bulkWrite | écriture | Comme bulkWrite : des insertOne, updateOne, updateMany, replaceOne, deleteOne, deleteMany dans l’ordre (ordered). |
POST | /v1/bases/{base}/collections/{collection}:aggregate | lecture | Comme aggregate : un pipeline, ses résultats 1000 par 1000 (limit, skip). |
POST | /v1/bases/{base}/collections/{collection}:estimatedDocumentCount | lecture | Comme estimatedDocumentCount. |
POST | /v1/bases/{base}/collections/{collection}:createIndex | écriture | Comme createIndex : keys et options (unique, name, partialFilterExpression, texte, wildcard). |
POST | /v1/bases/{base}/collections/{collection}:createIndexes | écriture | Comme createIndexes : plusieurs index d’un coup. |
POST | /v1/bases/{base}/collections/{collection}:listIndexes | lecture | Comme listIndexes : les index de la collection. |
POST | /v1/bases/{base}/collections/{collection}:dropIndex | écriture | Comme dropIndex : un index, par son nom ou ses clés. |
POST | /v1/bases/{base}/collections/{collection}:dropIndexes | écriture | Comme dropIndexes : tous les index (sauf _id). |
POST | /v1/bases/{base}/collections/{collection}:watch | lecture | Comme watch : les changements de la collection (pipeline, resumeAfter, fullDocument…). |
POST | /v1/bases/{base}/collections/{collection}:distinct | lecture | Comme distinct : les valeurs d’un champ (key, filter). |
POST | /v1/bases/{base}/collections/{collection}:findOne | lecture | Comme findOne : le premier document du filtre, ou null. |
POST | /v1/bases/{base}/collections/{collection}:countDocuments | lecture | Comme countDocuments. |
POST | /v1/bases/{base}/collections/{collection}:insertOne | écriture | Comme insertOne (corps : { document }). |
POST | /v1/bases/{base}/collections/{collection}:insertMany | écriture | Comme insertMany (corps : { documents }, 1000 au plus), tout ou rien. |
POST | /v1/bases/{base}/collections/{collection}:updateOne | écriture | Comme updateOne : filter, update ($set, $inc…), upsert. |
POST | /v1/bases/{base}/collections/{collection}:updateMany | écriture | Comme updateMany. |
POST | /v1/bases/{base}/collections/{collection}:replaceOne | écriture | Comme replaceOne : filter, replacement, upsert. |
POST | /v1/bases/{base}/collections/{collection}:deleteOne | écriture | Comme deleteOne. |
POST | /v1/bases/{base}/collections/{collection}:deleteMany | écriture | Comme deleteMany. |
Les arguments des méthodes de MongoDB sont ceux de son pilote : filter, update, sort, projection, limit, skip, pipeline, upsert, ordered… La bibliothèque Node.js donne la liste des opérateurs.