Plan de table de mariage : placez vos invités automatiquement
14 invités à des tables de 8 donnent 2 tables : la famille de la mariée et les amis de fac remplissent la première, la famille du marié et deux invités sans groupe occupent la seconde, avec 2 places libres. Gratuit dans votre navigateur.
- Gratuit
- Fonctionne dans votre navigateur
- Sans inscription
- Vos données restent sur votre appareil
Lancer gratuitement
Exemple résolu
- Taille de la table
- 8
- Nombre de tables
- 2
- Nombre d'invités
- 14
- Places vides
- 2
Les invités d'un même groupe sont placés à la même table dès que la place le permet, les groupes les plus nombreux sont placés en premier pour ne pas être bloqués par des sièges libres fragmentés, et tout groupe qui ne peut tout simplement pas tenir à une seule table est signalé par une erreur au lieu d'être divisé en silence. Le résultat est un plan de table déterministe, prêt à imprimer.
Un plan de table sans tableur
Quiconque a organisé un mariage sait que le plan de table est la tâche qui dévore les deux dernières semaines. La liste est enfin arrêtée, puis une tante téléphone, puis un cousin annule, et les tables si soigneusement agencées s'effondrent. Le générateur de plan de table de mariage retire les calculs de cette boucle.
Vous fournissez la liste des invités, chacun étiqueté avec son groupe — la famille de la mariée, les collègues du marié, les amis de fac — et le nombre de places par table. L'outil renvoie les tables, qui y siège et combien de places restent libres. Modifiez la liste, relancez, et vous obtenez un nouveau plan en quelques millisecondes au lieu d'une soirée à déplacer des noms dans un document.
L'algorithme étant déterministe, la même entrée produit toujours le même plan : vous pouvez comparer deux versions de la liste en étant certain que toute différence vient des données, pas du hasard.
Comment les groupes restent ensemble
L'attribution repose sur une stratégie « first-fit decreasing », l'approche classique pour ce type de problème de rangement. D'abord, les invités sont rassemblés par groupe ; un invité sans affiliation devient un groupe d'une personne, ce qui convient parfaitement aux accompagnants et aux collègues qui ne connaissent personne d'autre. Les groupes sont ensuite triés du plus grand au plus petit, afin que les grandes tables familiales soient réservées avant que la salle ne se remplisse de couples et d'invités seuls.
Chaque groupe est placé à la première table ayant encore assez de places libres, et une nouvelle table ne s'ouvre que si aucune table existante ne peut accueillir le groupe entier.
Conseils pratiques pour un vrai mariage
Choisissez des groupes qui reflètent la façon dont les gens veulent vraiment s'asseoir, pas toutes les étiquettes imaginables : huit à quinze affiliations significatives suffisent pour un mariage de cent invités. Si votre salle propose des tables de tailles différentes, lancez l'outil une fois par taille et comparez les places vides — le résultat indique exactement combien de sièges restent inutilisés, le chiffre qui compte quand le traiteur facture au couvert.
Les couples qui doivent s'asseoir ensemble mais appartiennent à des cercles différents peuvent recevoir une étiquette de groupe commune pour forcer le rapprochement. Et n'oubliez pas que l'outil optimise la cohésion et le nombre de tables, pas la politique familiale : il ne saura pas que deux oncles ne doivent pas partager une table. Considérez son résultat comme une excellente première ébauche, puis déplacez les deux ou trois noms que votre connaissance de la famille vous dicte.
Cas d’usage
Ébaucher le plan de table de la réception
Transformez une liste d'invités définitive en plan de table en un appel, et régénérez-le instantanément quand les réponses changent.
Comparer les tailles de tables de la salle
Lancez la même liste avec des tables de 8, 10 et 12 pour voir quelle configuration gaspille le moins de places payées.
Placer un dîner d'entreprise ou un gala
Gardez départements et équipes clients ensemble aux tables du banquet sans dessiner la salle à la main.
Questions fréquentes
Combien cela coûte-t-il ?
C'est aussi gratuit dans votre navigateur sur cette page, avec le même moteur.
Et les invités sans groupe ?
Chaque invité sans affiliation est traité comme un groupe d'une personne et sert à remplir les places restantes après le placement des grands groupes.
Le résultat est-il toujours identique pour la même liste ?
Oui. L'algorithme est entièrement déterministe : une entrée identique donne toujours un plan de table identique.
L'outil minimise-t-il le nombre de tables ?
Il utilise le « first-fit decreasing », une heuristique de rangement bien connue qui privilégie l'intégrité des groupes et utilise généralement très peu de tables, en indiquant le nombre de places vides pour juger la configuration.
Que se passe-t-il si une famille dépasse la taille d'une table ?
Le plan n'est pas établi et un message clair indique le nom de ce groupe et sa taille. Une famille n'est jamais répartie sur plusieurs tables en silence : cette décision vous revient, pas à l'outil.
Outils associés
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/life/wedding-guest-seating \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"guests":[{"name":"Ana","group":"Bride family"},{"name":"Luis","group":"Bride family"},{"name":"Marta","group":"College friends"},{"name":"Pablo","group":"College friends"},{"name":"Sofia"}],"table_size":8}'const res = await fetch("https://api.kit.forhosting.com/life/wedding-guest-seating", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"guests": [
{
"name": "Ana",
"group": "Bride family"
},
{
"name": "Luis",
"group": "Bride family"
},
{
"name": "Marta",
"group": "College friends"
},
{
"name": "Pablo",
"group": "College friends"
},
{
"name": "Sofia"
}
],
"table_size": 8
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/life/wedding-guest-seating",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"guests": [
{
"name": "Ana",
"group": "Bride family"
},
{
"name": "Luis",
"group": "Bride family"
},
{
"name": "Marta",
"group": "College friends"
},
{
"name": "Pablo",
"group": "College friends"
},
{
"name": "Sofia"
}
],
"table_size": 8
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/life/wedding-guest-seating", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"guests":[{"name":"Ana","group":"Bride family"},{"name":"Luis","group":"Bride family"},{"name":"Marta","group":"College friends"},{"name":"Pablo","group":"College friends"},{"name":"Sofia"}],"table_size":8}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"guests":[{"name":"Ana","group":"Bride family"},{"name":"Luis","group":"Bride family"},{"name":"Marta","group":"College friends"},{"name":"Pablo","group":"College friends"},{"name":"Sofia"}],"table_size":8}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/life/wedding-guest-seating", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"guests": [
{
"name": "Ana",
"group": "Bride family"
},
{
"name": "Luis",
"group": "Bride family"
},
{
"name": "Marta",
"group": "College friends"
},
{
"name": "Pablo",
"group": "College friends"
},
{
"name": "Sofia"
}
],
"table_size": 8
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "life.wedding_guest_seating",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_guests | 1000 |
max_groups | 200 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |
Notes techniques
L'API de plan de table de mariage prend une liste d'invités — chacun avec une affiliation facultative à un groupe, comme une branche familiale ou un cercle d'amis — ainsi que la capacité d'une table, et renvoie un plan de table complet.
Comment les groupes restent ensemble
Un groupe n'est jamais réparti sur plusieurs tables : si une affiliation compte plus de membres que la capacité d'une table, l'API rejette la demande avec une erreur claire nommant le groupe et sa taille, car diviser une famille est une décision qui vous revient, pas un choix qu'un logiciel devrait faire silencieusement.
Questions techniques
Que se passe-t-il si un groupe est plus grand qu'une table ?
La requête échoue avec une erreur invalid_input nommant le groupe et sa taille. Les groupes ne sont jamais divisés automatiquement.
Combien d'invités peut-il gérer ?
Jusqu'à 1000 invités et 200 groupes distincts par requête, bien au-delà de tout mariage.