> ## Documentation Index
> Fetch the complete documentation index at: https://developers.marko.fr/llms.txt
> Use this file to discover all available pages before exploring further.

# IA et outils de développement

> Copier une page ou toute la documentation, récupérer OpenAPI et générer un client.

export const CopyDocumentation = ({topic = "marko-documentation", label, chooseFamily = false}) => {
  const [state, setState] = useState("idle");
  const [message, setMessage] = useState("");
  const [selected, setSelected] = useState(topic);
  const [topics, setTopics] = useState([]);
  const base = "https://raw.githubusercontent.com/mathieuworoniecki/marko-developer-docs/main/downloads/";
  useEffect(() => {
    if (!chooseFamily) return;
    let active = true;
    fetch(base + "index.json").then(async response => {
      if (!response.ok) throw new Error("Index indisponible");
      const index = await response.json();
      if (active && index.format === "marko-documentation-index/v1") setTopics(index.topics);
    }).catch(() => {
      if (active) setMessage("La liste des périmètres est indisponible. La copie complète reste accessible.");
    });
    return () => {
      active = false;
    };
  }, [chooseFamily]);
  const id = chooseFamily ? selected : topic;
  const downloadUrl = base + encodeURIComponent(id) + ".json";
  const copy = async () => {
    setState("loading");
    setMessage("");
    try {
      const document = fetch(downloadUrl).then(async response => {
        if (!response.ok) throw new Error("Documentation indisponible");
        const payload = await response.json();
        const text = payload.markdown;
        if (payload.format !== "marko-documentation/v1" || typeof text !== "string" || !text.startsWith("# MARKO — ")) {
          throw new Error("Format de documentation inattendu");
        }
        return text;
      });
      if (navigator.clipboard.write && typeof ClipboardItem !== "undefined") {
        await navigator.clipboard.write([new ClipboardItem({
          "text/plain": document.then(text => new Blob([text], {
            type: "text/plain"
          }))
        })]);
      } else {
        await navigator.clipboard.writeText(await document);
      }
      setState("copied");
      setMessage("Documentation copiée. Vous pouvez la coller dans votre assistant.");
    } catch {
      setState("error");
      setMessage("La copie n'a pas abouti. Utilisez le lien de téléchargement ci-dessous.");
    }
  };
  return <div className="not-prose my-4">
      {chooseFamily && <label className="mb-3 block text-sm">
          <span className="mb-1 block">Documentation à copier</span>
          <select aria-label="Documentation à copier" value={selected} disabled={state === "loading"} onChange={event => {
    setSelected(event.target.value);
    setState("idle");
    setMessage("");
  }} className="w-full rounded-lg border px-3 py-2" style={{
    color: "inherit",
    backgroundColor: "transparent",
    borderColor: "#087E8B"
  }}>
            {!topics.length && <option value="marko-documentation">Toute la documentation</option>}
            {topics.map(item => <option key={item.id} value={item.id}>{item.kind === "tutorial" ? "Tutoriel : " : item.kind === "family" ? "API : " : ""}{item.title}</option>)}
          </select>
        </label>}
      <button type="button" onClick={copy} disabled={state === "loading"} className="rounded-lg border px-4 py-2 text-sm font-semibold disabled:opacity-60 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2" style={{
    backgroundColor: "#76E7F4",
    color: "#092E33",
    borderColor: "#087E8B"
  }}>
        {state === "loading" ? "Copie en cours…" : state === "copied" ? "Documentation copiée ✓" : label || (chooseFamily ? "Copier la sélection pour une IA" : "Copier toute la documentation pour une IA")}
      </button>
      <p className="mt-2 text-sm" role="status" aria-live="polite">{message}</p>
      <a className="text-sm underline" href={downloadUrl}>{chooseFamily || topic !== "marko-documentation" ? "Télécharger cette documentation" : "Télécharger la documentation complète"}</a>
    </div>;
};

## Copier toute la documentation

<CopyDocumentation />

Le fichier regroupe les guides et le contrat OpenAPI enrichi des 158 opérations stables, avec ses schémas référencés. Il est volumineux : pour une tâche ciblée, fournir seulement les pages utiles évite de saturer le contexte de votre assistant.

## Copier une famille API ou un tutoriel

<CopyDocumentation chooseFamily />

La sélection contient les guides utiles, l'authentification, les routes du périmètre choisi et tous leurs schémas référencés. Un tutoriel inclut les contrats des appels qu'il utilise. Le texte copié est autonome : aucun schéma nécessaire n'est remplacé par un lien vers une autre partie du contrat.

## Copier une page

Le menu **Copy page** de chaque page permet de copier son Markdown, voir la version texte et l'ouvrir dans ChatGPT ou Claude. Les pages API contiennent le scope requis dans leur texte; les extensions `x-marko-*` du contrat ne sont pas le seul endroit où lire cette information.

L'[index des pages](https://developers.marko.fr/llms.txt?v=20261001-2) permet à un agent de découvrir la documentation. Les pages sont également disponibles en Markdown en ajoutant `.md` à leur URL. Le [texte agrégé du site](https://developers.marko.fr/llms-full.txt) rassemble les guides et les descriptions des routes. Pour obtenir tous les schémas de requête et de réponse, utilisez la copie complète ci-dessus, le contrat OpenAPI enrichi ou les pages API individuelles.

## Contrats machine

| Document | Usage |
| - | - |
| [OpenAPI enrichi de cette documentation](https://raw.githubusercontent.com/mathieuworoniecki/marko-developer-docs/main/openapi.json) | Types réels, champs obligatoires, réponses, scopes et exemples synthétiques. |
| [OpenAPI public de l'API](https://partner-api.marko.fr/v1/openapi.json) | Catalogue stable fourni directement par le service. |
| [Collection Postman publique](https://partner-api.marko.fr/v1/postman.json) | Explorer les appels du catalogue public. |
| Export filtré par clé dans MARKO | Voir les opérations autorisées par les scopes et restrictions d'une clé donnée. |

Le contrat enrichi contient `x-documentation-provenance`, qui identifie la version du backend utilisée pour les types et l'empreinte du catalogue public. Une référence documentée ne prouve pas que votre clé y a accès ni qu'une ressource d'exemple existe.

Le téléchargement complet est un fichier JSON dont le champ `markdown` contient le texte à fournir à votre assistant. Le bouton de copie extrait directement ce texte pour le presse-papiers.

## SDK et client généré

Pour démarrer avec un client JSON, utiliser les [exemples Python, Node.js et PHP](/code-examples). Ils prennent en charge la signature HMAC et le renouvellement du bearer.

Cette documentation ne fournit pas de SDK officiel MARKO. Vous pouvez générer un client à partir d'OpenAPI avec un générateur compatible OpenAPI 3.1, puis ajouter l'échange HMAC et la gestion des reprises. Le client HTTP doit prendre en charge les timeouts, `application/problem+json`, les fichiers multipart et les réponses binaires.

Conservez les secrets dans l'environnement du serveur ou un gestionnaire de secrets. Les exemples sont synthétiques : remplacez leurs identifiants par ceux de votre contexte, sans les traiter comme des ressources de test disponibles.

## Contexte utile pour un assistant

```text theme={null}
Utilise la documentation MARKO Developers et son OpenAPI enrichi.
Base URL: https://partner-api.marko.fr/v1 (ou l'hôte fourni par notre équipe).
Authentification: HMAC-SHA256 vers POST /auth/token, puis bearer court.
Vérifie le scope de chaque route et les capacités de délégation nécessaires.
Préserve les identifiants externes et les clés d'idempotence entre les reprises.
Ne considère pas HTTP 202 comme la fin d'un traitement.
Consulte les taxonomies et le référentiel des champs plutôt que d'inventer des codes.
Pour un fichier neuf, utilise directement /documents/external/{external_id}/upload.
N'invente pas de route, de SDK officiel, de droit d'accès ou de donnée d'exemple réelle.
Ne place jamais un secret ou un bearer dans le code publié.
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.