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

# Publicação em massa (Bulk Post)

> Agende publicações em massa com um arquivo 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 />

Agende publicações em massa com um arquivo CSV (Comma Separated Values) contendo os dados das publicações.
O Content-Type deve ser `multipart/form-data`.

<Warning>
  Recomendamos usar o [endpoint Post](/apis/post/post) diretamente em vez deste método em massa para
  agendar publicações. O endpoint direto oferece um conjunto de recursos mais abrangente e melhores
  capacidades de depuração.
</Warning>

## Parâmetros de cabeçalho

<ParamField header="Authorization" type="string" required>
  Formato: `Authorization: Bearer API_KEY`. Consulte a [visão geral da API](/apis/overview#authorization) para mais
  informações.
</ParamField>

<ParamField header="Profile-Key" type="string">
  Profile Key de um perfil de usuário.
</ParamField>

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

## Parâmetros do corpo

<ParamField path="file" type="object">
  Arquivo CSV em multipart form-data contendo as publicações agendadas. Veja abaixo o [modelo CSV](#csv-template).
</ParamField>

## Exemplos de requisição

Um multipart form-data contendo um arquivo CSV de publicações irá agendá-las para uma data futura.

O arquivo CSV contém os seguintes campos (modelo abaixo) e todos são obrigatórios:

<ul class="custom-bullets">
  <li>`post`: O texto da publicação.</li>
  <li>`platforms`: Lista de plataformas separadas por vírgula, por exemplo, "twitter, facebook, instagram".</li>
  <li>`mediaUrls`: URL da mídia, como uma imagem ou vídeo a ser incluído na publicação.</li>

  <li>
    `scheduleDate`: Data/hora para agendar a publicação em formato UTC. Por exemplo, use o formato
    `YYYY-MM-DDThh:mm:ssZ` e envie como `2026-07-08T12:30:00Z`. Consulte
    [utctime](https://www.utctime.net/) para mais exemplos.
  </li>
</ul>

<Warning>
  Não envie publicações duplicadas com menos de dois dias de intervalo.

  Se o scheduleDate de duas publicações com exatamente o mesmo texto estiver a menos de três dias de distância, a segunda publicação será rejeitada quando o scheduleDate ocorrer.
  Isso é feito para proteger sua conta nas redes; elas podem suspender ou aplicar shadow-ban em contas com publicações duplicadas frequentes.
</Warning>

## Modelo CSV

Baixe o modelo e salve como um arquivo .csv.

[Modelo CSV do 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 Exemplo com duas publicações agendadas. 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>
