FlowKit

Connecter n8n à Supabase : le guide complet (auth, requêtes, vecteurs)

Publié le 18 juillet 2026 · 4 min de lecture

Gros plan d'un circuit imprimé bleu nuit aux pistes dorées
fig. 01quatre portes d'entrée vers Supabase depuis n8n

Supabase est le backend le plus rentable à connaître quand on automatise avec n8n : un Postgres managé, une API REST générée automatiquement, l'authentification intégrée et pgvector pour l'IA — le tout avec un palier gratuit généreux. Ce guide couvre les quatre façons de le brancher à n8n : le node Supabase pour le CRUD, l'API d'auth pour gérer des utilisateurs, les RPC pour les fonctions Postgres, et les vecteurs pour le RAG.

1. La credential : service_role, et pourquoi

Dans n8n : Credentials → New → Supabase API. Deux champs :

  • Host : l'URL du projet, https://votre-projet.supabase.co (dans Project Settings → API) ;
  • Service Role Secret : la clé service_role — pas la clé anon.

Pourquoi service_role ? Parce que n8n est un backend de confiance : vos workflows doivent lire et écrire sans être bloqués par la Row Level Security. Corollaire immédiat : cette clé contourne toutes vos policies RLS. Elle ne doit jamais apparaître côté client, ni dans un webhook renvoyé au navigateur. Quand un workflow doit agir au nom d'un utilisateur précis, on n'utilise pas le node Supabase : on appelle l'API REST avec le JWT de l'utilisateur (section 3).

2. CRUD : le node Supabase au quotidien

Table d'exemple — des leads entrants à enrichir :

create table leads (
  id uuid primary key default gen_random_uuid(),
  email text not null unique,
  source text,
  score int,
  traite boolean default false,
  created_at timestamptz default now()
);

Les quatre opérations du node Supabase (resource Row) :

  • Create : mappez les colonnes (email, source) depuis les données du node précédent. Piège : une violation d'unicité (email en double) fait échouer l'item — activez Settings → On Error → Continue si le doublon est un cas normal.
  • Get Many : cochez Use Custom Filters pour la syntaxe PostgREST. Exemple réel — les leads non traités avec un score d'au moins 60 : traite=eq.false&score=gte.60&order=created_at.desc&limit=20.
  • Update : filtre id=eq.{{ $json.id }}, puis les colonnes à modifier (traitetrue). Sans filtre, PostgREST refuse — c'est votre garde-fou contre l'update global accidentel.
  • Delete : même logique de filtre. Préférez souvent un update archive=true : un workflow qui supprime en masse sur un filtre mal écrit ne pardonne pas.

Les opérateurs PostgREST à connaître : eq, neq, gt/gte, lt/lte, like.*motif*, ilike (insensible à la casse), in.(a,b,c), is.null.

3. Auth : créer et connecter des utilisateurs depuis n8n

Le node Supabase ne gère pas l'authentification — c'est le rôle de l'API GoTrue, à appeler avec un node HTTP Request. Trois appels couvrent l'essentiel.

Créer un utilisateur (en admin, avec la clé service_role) :

POST https://votre-projet.supabase.co/auth/v1/admin/users
Headers :
  apikey: <service_role>
  Authorization: Bearer <service_role>
Body (JSON) :
  { "email": "client@exemple.fr", "password": "motdepasse-fort",
    "email_confirm": true }

Connecter un utilisateur (récupérer son JWT) :

POST https://votre-projet.supabase.co/auth/v1/token?grant_type=password
Headers :
  apikey: <anon>
  Content-Type: application/json
Body (JSON) :
  { "email": "client@exemple.fr", "password": "motdepasse-fort" }

La réponse contient access_token : le JWT de l'utilisateur, valable une heure.

Requêter en tant qu'utilisateur — c'est ici que la RLS reprend ses droits. Appelez l'API REST avec le JWT à la place de la clé service_role :

GET https://votre-projet.supabase.co/rest/v1/leads?select=*
Headers :
  apikey: <anon>
  Authorization: Bearer {{ $json.access_token }}

Avec une policy RLS comme celle-ci, chaque utilisateur ne voit que ses lignes — même à travers n8n :

alter table leads enable row level security;

create policy "chacun voit ses leads"
  on leads for select
  using (auth.uid() = proprietaire_id);

4. RPC : appeler vos fonctions Postgres

Toute fonction Postgres est exposée sur /rest/v1/rpc/<nom>. C'est le pont entre n8n et votre logique SQL — y compris match_documents, la fonction de similarité vectorielle du RAG :

POST https://votre-projet.supabase.co/rest/v1/rpc/match_documents
Headers :
  apikey: <service_role>
  Authorization: Bearer <service_role>
  Content-Type: application/json
Body (JSON) :
  { "query_embedding": [0.0123, -0.0456, ...],
    "match_count": 4,
    "filter": { "source": "faq-produit" } }

Utile quand vous voulez la recherche vectorielle sans passer par les nodes LangChain — par exemple pour renvoyer les passages bruts dans une API.

5. Vecteurs : pgvector et le node Supabase Vector Store

Pour le RAG, n8n fournit un node dédié, Supabase Vector Store, qui réutilise la même credential et attend la table documents + la fonction match_documents (le script SQL complet est dans notre guide pgvector pas à pas). Trois modes à retenir :

  • Insert Documents : l'ingestion (chunks + embeddings) ;
  • Retrieve Documents (As Vector Store) : la recherche dans une chaîne ;
  • Retrieve Documents (As Tool for AI Agent) : le vector store devient un outil que l'AI Agent décide d'interroger — c'est le mode qu'utilise notre chatbot, y compris sur WhatsApp.

Règle d'or : le même modèle d'embedding à l'ingestion et à la recherche, et une dimension de colonne cohérente (vector(1536) pour text-embedding-3-small).

6. Et quand l'API ne suffit plus : le node Postgres

Jointures complexes, agrégations, insert ... on conflict, migrations : passez au node Postgres avec une connexion directe. Dans Project Settings → Database, prenez la chaîne du pooler en mode transaction (port 6543) — les workflows n8n ouvrent et ferment des connexions en rafale, le pooler est fait pour ça. Réservez le port 5432 (session) aux opérations qui l'exigent (listen/notify, prepared statements).

Aller plus loin

Vous avez maintenant les quatre portes d'entrée vers Supabase depuis n8n. La suite logique : le guide pgvector complet pour monter la partie vectorielle de bout en bout, puis le Pack Assistant RAG (119 €) — ingestion PDF, chatbot à citations, sync Notion et API /ask, quatre workflows n8n sur Supabase, testés et documentés en français, prêts à importer.

FAQ

Questions fréquentes

Quelle clé Supabase utiliser dans n8n : anon ou service_role ?

La credential du node Supabase attend la clé service_role : n8n est un backend de confiance et a souvent besoin d'écrire partout. Attention, cette clé contourne la Row Level Security — ne l'exposez jamais côté client, et si un workflow doit agir au nom d'un utilisateur, appelez l'API REST avec le JWT de cet utilisateur via un node HTTP Request à la place.

Node Supabase ou node Postgres : lequel choisir ?

Le node Supabase passe par l'API REST (PostgREST) : parfait pour du CRUD simple, filtres inclus, sans gérer de pool de connexions. Le node Postgres se connecte directement à la base (via le pooler, port 6543 en mode transaction) : indispensable pour du SQL brut, les jointures complexes, les agrégations et les migrations.

Comment appeler une fonction Postgres (RPC) depuis n8n ?

Le node Supabase ne couvre pas les RPC : utilisez un node HTTP Request en POST vers https://votre-projet.supabase.co/rest/v1/rpc/nom_de_la_fonction, avec les en-têtes apikey et Authorization: Bearer et les arguments de la fonction dans le corps JSON. C'est ainsi qu'on appelle match_documents en dehors des nodes vectoriels.

Le palier gratuit de Supabase suffit-il pour n8n en production ?

Pour un usage interne raisonnable, oui : 500 Mo de base, pgvector inclus, API REST illimitée en volume raisonnable. Ses vraies limites : la base est mise en pause après 7 jours d'inactivité (un workflow n8n planifié qui la ping chaque jour l'évite) et pas de sauvegardes automatiques — passez au plan Pro dès que les données comptent.

Pack Assistant RAG

119 €