> ## 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.

# Bulk-Post

> Beiträge per CSV-Datei im Bulk planen

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 />

Planen Sie Beiträge im Bulk mit einer CSV-Datei (Comma Separated Values), die Beitragsdaten enthält.
Der Content-Type muss `multipart/form-data` sein.

<Warning>
  Wir empfehlen, stattdessen den direkten [Post-Endpunkt](/apis/post/post) zum Planen von Beiträgen zu verwenden.
  Der direkte Endpunkt bietet einen umfassenderen Funktionsumfang und einfachere
  Debugging-Möglichkeiten.
</Warning>

## Header-Parameter

<ParamField header="Authorization" type="string" required>
  Format: `Authorization: Bearer API_KEY`. Weitere Informationen finden Sie in der [API-Übersicht](/apis/overview#authorization).
</ParamField>

<ParamField header="Profile-Key" type="string">
  Profile Key eines Benutzerprofils.
</ParamField>

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

## Body-Parameter

<ParamField path="file" type="object">
  Multipart-form-data-CSV-Datei mit geplanten Beiträgen. Siehe unten für die [CSV-Vorlage](#csv-template).
</ParamField>

## Anfragebeispiele

Ein Multipart-form-data mit einer CSV-Datei von Beiträgen plant diese für ein zukünftiges Datum.

Die CSV-Datei enthält die folgenden Felder (Vorlage unten), die alle erforderlich sind:

<ul class="custom-bullets">
  <li>`post`: Der Beitragstext.</li>
  <li>`platforms`: Durch Kommas getrennte Liste von Plattformen, z. B. „twitter, facebook, instagram".</li>
  <li>`mediaUrls`: URL des Mediums, etwa eines Bildes oder Videos, das in den Beitrag aufgenommen werden soll.</li>

  <li>
    `scheduleDate`: Datum/Uhrzeit zur Planung des Beitrags im UTC-Format. Verwenden Sie beispielsweise das Format
    `YYYY-MM-DDThh:mm:ssZ` und senden Sie `2026-07-08T12:30:00Z`. Weitere Beispiele finden Sie unter
    [utctime](https://www.utctime.net/).
  </li>
</ul>

<Warning>
  Senden Sie keine doppelten Beiträge im Abstand von weniger als zwei Tagen.

  Liegen die scheduleDates zweier Beiträge mit exakt gleichem Text weniger als drei Tage auseinander, wird der zweite Beitrag beim Eintreten des scheduleDate abgelehnt.
  Dies dient dem Schutz Ihres Kontos bei den Netzwerken; sie können Konten mit häufigen doppelten Beiträgen sperren oder shadowbannen.
</Warning>

## CSV-Vorlage

Laden Sie die Vorlage herunter und speichern Sie sie als .csv-Datei.

[Ayrshare-CSV-Vorlage](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>
