Créer un sujet

POST /api/v1/topics Crée un sujet. Répond 201 avec le sujet créé — son id est le topicId que vous attachez à une campagne ou à une séquence. Un nom déjà pris — sans tenir compte de la casse, donc Freelancing entre en collision avec freelancing — répond 409.

Autorisation

Rôle dans l'organisationCet endpoint
OWNERAutorisé
ADMINAutorisé
MEMBERRefusé — 403
Une clé porte le rôle que son créateur détient dans cette organisation — jamais un rôle sur AgentsMail lui-même. Voir Clés d'API.

Corps de la requête

ChampTypeObligatoireDescription
namestringouiDe 1 à 50 caractères
json
{"name": "freelancing"}

Exemple

bash
curl -X POST -H "x-api-key: $AGENTMAIL_API_KEY" -H "content-type: application/json" \
  -d '{"name":"freelancing"}' \
  "https://www.agentsmail.io/api/v1/topics"

Réponse

  • 201 Created — le sujet créé.
  • 400 Bad Request — le nom est absent, vide ou dépasse 50 caractères ; details porte les erreurs champ par champ.
  • 401 Unauthorized — clé absente ou invalide, ou son propriétaire a quitté l'organisation.
  • 403 Forbidden — le propriétaire de la clé est member de l'organisation, pas admin.
  • 409 Conflict — un autre sujet porte déjà ce nom, casse ignorée. Rien n'a été créé ; listez les sujets et réutilisez l'identifiant existant.
  • 429 Too Many Requests — plus de 120 requêtes en une minute pour cette clé.

Champs de la réponse

ChampTypeDescription
successbooleanIndique si l'opération a réussi
data.idstringIdentifiant unique du sujet
data.namestringNom du sujet, unique dans l'organisation
data.createdAtstringDate de création ISO
data.updatedAtstringDate ISO de la dernière modification

Exemple de réponse

json
{
  "success": true,
  "data": {
    "id": "7c2e4b19",
    "name": "freelancing",
    "createdAt": "2026-08-23T10:22:05.000Z",
    "updatedAt": "2026-08-23T10:22:05.000Z"
  }
}

Recette pour agent

Réutilisez avant de créer — un second appel pour un nom déjà pris ne vous rapporte qu'un 409 :
js
const existing = await list('/api/v1/topics')
const topic =
  existing.data.find((t) => t.name.toLowerCase() === 'freelancing') ??
  (await post('/api/v1/topics', {name: 'freelancing'})).data

await post('/api/v1/campaigns', {
  name: 'Freelance news',
  subject: 'This month for freelancers',
  templateId,
  listId,
  topicId: topic.id,
})

Remarques

  • Créer un sujet ne change rien en soi. Il commence à compter le jour où une campagne ou une séquence le porte.

Voir aussi