> ## Documentation Index
> Fetch the complete documentation index at: https://www.ayrshare.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Publication en masse

> Planifiez des publications en masse avec un fichier CSV

export const XByoNotice = () => <Info>
  <strong>Targeting X/Twitter?</strong> Starting March 31, 2026, all X operations require your own API credentials. After linking X via OAuth, include these 2 headers in your request:
  <br /><br />
  <code>X-Twitter-OAuth1-Api-Key</code> — Your API Key (Consumer Key)<br />
  <code>X-Twitter-OAuth1-Api-Secret</code> — Your API Key Secret (Consumer Secret)
  <br /><br />
  <strong>One-time setup per Ayrshare account.</strong> You create one X Developer App and reuse the same API Key and Secret across every sub-profile / end-user you link. You do <em>not</em> create a new app per customer.
  <br /><br />
  Not linked yet? See the <a href="/dashboard/connect-social-accounts/x-twitter-byo-keys">full setup guide</a> to connect your X account.
  <br /><br />
  Your keys are never logged or stored by Ayrshare.
</Info>;

export const PlansAvailable = ({plans = [], maxPackRequired}) => {
  let displayPlans = plans;
  if (plans && plans.length === 1) {
    const lowerCasePlan = plans[0].toLowerCase();
    if (lowerCasePlan === "business") {
      displayPlans = ["Launch", "Business", "Enterprise"];
    } else if (lowerCasePlan === "premium") {
      displayPlans = ["Premium", "Launch", "Business", "Enterprise"];
    }
  }
  return <Note>
Available on {displayPlans.length === 1 ? "the " : ""}
{displayPlans.join(", ").replace(/\b\w/g, l => l.toUpperCase())}{" "}
{displayPlans.length > 1 ? "plans" : "plan"}.

{maxPackRequired && <span onClick={() => window.open('https://www.ayrshare.com/docs/additional/maxpack', '_self')} className="flex items-center mt-2 cursor-pointer">
 <span className="px-1.5 py-0.5 rounded text-sm" style={{
    backgroundColor: '#C264B6',
    color: 'white',
    fontSize: '12px'
  }}>
   Max Pack required
 </span>
</span>}
</Note>;
};

<PlansAvailable plans={["premium"]} maxPackRequired={false} />

<XByoNotice />

Planifiez des publications en masse à l'aide d'un fichier CSV (valeurs séparées par des virgules) contenant les données des publications.
Le Content-Type doit être `multipart/form-data`.

<Warning>
  Nous recommandons d'utiliser directement le [point de terminaison Post](/apis/post/post) plutôt que cette méthode en masse pour
  planifier des publications. Le point de terminaison direct offre un ensemble de fonctionnalités plus complet et des capacités de
  débogage plus simples.
</Warning>

## Paramètres d'en-tête

<ParamField header="Authorization" type="string" required>
  Format : `Authorization: Bearer API_KEY`. Consultez la [vue d'ensemble de l'API](/apis/overview#authorization) pour plus
  d'informations.
</ParamField>

<ParamField header="Profile-Key" type="string">
  Profile Key d'un User Profile.
</ParamField>

<ParamField header="Content-Type" type="string" required>
  `Content-Type: multipart/form-data`
</ParamField>

## Paramètres du corps

<ParamField path="file" type="object">
  Fichier CSV multipart form-data des publications planifiées. Voir ci-dessous le [modèle CSV](#csv-template).
</ParamField>

## Exemples de requête

Un multipart form-data contenant un fichier CSV de publications les planifiera pour une date future.

Le fichier CSV contient les champs suivants (modèle ci-dessous) et sont requis :

<ul class="custom-bullets">
  <li>`post` : le texte de la publication.</li>
  <li>`platforms` : liste des plateformes séparées par des virgules, par ex. « twitter, facebook, instagram ».</li>
  <li>`mediaUrls` : URL du média, par exemple une image ou une vidéo à inclure dans la publication.</li>

  <li>
    `scheduleDate` : date et heure de planification de la publication au format UTC. Par exemple, utilisez le format
    `YYYY-MM-DDThh:mm:ssZ` et envoyez `2026-07-08T12:30:00Z`. Consultez
    [utctime](https://www.utctime.net/) pour plus d'exemples.
  </li>
</ul>

<Warning>
  N'envoyez pas de publications en double à moins de deux jours d'intervalle.

  Si la scheduleDate de deux publications avec exactement le même texte est distante de moins de trois jours, la deuxième publication sera rejetée au moment de sa scheduleDate.
  Cela vise à protéger votre compte sur les réseaux ; ils peuvent suspendre ou shadow-ban les comptes qui publient fréquemment des doublons.
</Warning>

## Modèle CSV

Téléchargez le modèle et enregistrez-le au format .csv.

[Modèle CSV Ayrshare](https://img.ayrshare.com/012/Ayrshare_CSV_Template.csv)

<RequestExample>
  ```bash cURL theme={"system"}
  curl \
  -H "Authorization: Bearer API_KEY" \
  -H 'Content-Type: multipart/form-data' \
  -F 'file=@"./Ayrshare CSV Template.csv"' \
  -X POST https://api.ayrshare.com/api/post/bulk
  ```

  ```javascript JavaScript theme={"system"}
  const API_KEY = "API_KEY";
  const FormData = require("form-data");
  const fs = require("fs");

  const formData = new FormData();
  formData.append("file", fs.createReadStream("./Ayrshare CSV Template.csv"));

  fetch("https://api.ayrshare.com/api/post/bulk", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${API_KEY}`,
      ...formData.getHeaders()
    },
    body: formData
  })
    .then((res) => res.json())
    .then((data) => {
      console.log(JSON.stringify(data));
    })
    .catch((error) => {
      console.log(error);
    });
  ```

  ```python Python theme={"system"}
  import requests

  API_KEY = "API_KEY"

  # Open the CSV file in binary read mode
  with open('./Ayrshare CSV Template.csv', 'rb') as file:
      # Prepare the files dictionary for the multipart/form-data request
      files = {'file': file}

      # Set up the authorization header
      headers = {'Authorization': f'Bearer {API_KEY}'}

      try:
          # Make the POST request to the API
          response = requests.post(
              'https://api.ayrshare.com/api/post/bulk',
              headers=headers,
              files=files
          )

          # Parse and print the JSON response
          data = response.json()
          print(data)

      except Exception as e:
          print(f"Error: {e}")
  ```
</RequestExample>

<ResponseExample>
  ```javascript 200: OK Example with two scheduled posts. theme={"system"}
  {
      "status": "success",
      "posts": [
          {
              "status": "scheduled",
              "scheduleDate": "4/6/21 12:50",
              "id": "X3uTExuEJhyM3u8wCRsA",
              "post": "A great post"
          },
          {
              "status": "scheduled",
              "scheduleDate": "4/6/21 13:00",
              "id": "8RGrekuxMnVa7lVnARFm",
              "post": "An even better post"
          }
      ]
  }
  ```
</ResponseExample>
