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

# Sync data to Meilisearch with Kestra

> Keep Meilisearch in sync with your data sources using declarative Kestra workflows.

[Kestra](https://kestra.io) is an open-source orchestration platform that runs data pipelines from declarative YAML. The [Kestra Meilisearch plugin](https://kestra.io/plugins/plugin-meilisearch) lets you index documents into Meilisearch as a first-class workflow task, so keeping your search index current becomes an observable, retryable, scheduled job instead of a script you have to babysit.

## Why orchestrate the sync

A cron job calling a custom script works right up until it doesn't: a network blip leaves your index half-updated, nobody notices the job died days ago, and there is no record of what synced when. Kestra makes the sync a first-class workflow. Every run is logged, retried on failure, observable in a UI, and triggered by a schedule or an event. You describe what should happen, and Kestra handles execution, state, and failure.

## How the pipelines work

Most guides in this series follow the same arc: a one-shot **backfill** for the initial load, then an **incremental sync** that keeps Meilisearch current as data is inserted, updated, and deleted. The Elasticsearch and OpenSearch guides are migrations, pairing the backfill with a safe parallel-run cutover. Three ideas recur throughout:

* **ION is the handoff format.** Every Kestra extractor writes [ION](https://amazon-ion.github.io/ion-docs/) to internal storage, and the Meilisearch `DocumentAdd` task reads exactly that. The pipelines are just "extract, convert, index" with no glue code.
* **Upserts are idempotent.** `DocumentAdd` is add-or-replace, so overlapping sync windows and accidental re-runs are always safe.
* **Deletes need explicit handling.** `DocumentAdd` never removes documents. Each guide covers the delete strategy appropriate to its source (soft deletes plus `documents/delete-batch`, tombstone events, or an index alias swap).

<Note>
  Store credentials as Kestra secrets (`{{ secret('NAME') }}`), never as plaintext. Inline values in these guides are for readability only.
</Note>

## Guides

Each guide targets a [Meilisearch Cloud](https://www.meilisearch.com/cloud?utm_campaign=oss\&utm_source=docs\&utm_medium=kestra-integration) project (fully managed, nothing to host). You supply your project URL and Default Admin API key.

<CardGroup cols={2}>
  <Card title="PostgreSQL" icon="database" href="/getting_started/integrations/kestra/postgresql">
    Relational database. Scheduled lookback window on `updated_at`, soft deletes via delete-batch.
  </Card>

  <Card title="MongoDB" icon="leaf" href="/getting_started/integrations/kestra/mongodb">
    Document database. Scheduled lookback on an `updatedAt` ISO string, soft deletes via delete-batch.
  </Card>

  <Card title="Amazon S3" icon="aws" href="/getting_started/integrations/kestra/amazon_s3">
    Object storage. Event-driven trigger on a prefix with exactly-once processing.
  </Card>

  <Card title="Kafka" icon="bolt" href="/getting_started/integrations/kestra/kafka">
    Event stream. Real-time trigger, one execution per message.
  </Card>

  <Card title="REST API" icon="cloud" href="/getting_started/integrations/kestra/rest_api">
    HTTP API. A `?updated_since` filter with a KV watermark, or a scheduled full re-index.
  </Card>

  <Card title="Elasticsearch" icon="magnifying-glass" href="/getting_started/integrations/kestra/elasticsearch">
    Search engine migration. Scroll the whole index, then cut over with a parallel run.
  </Card>

  <Card title="OpenSearch" icon="binoculars" href="/getting_started/integrations/kestra/opensearch">
    Search engine migration. Scroll the whole index, then cut over with a parallel run.
  </Card>

  <Card title="RabbitMQ" icon="rabbit" href="/getting_started/integrations/kestra/rabbitmq">
    AMQP queue. Real-time trigger, one execution per message, delete events routed to delete-batch.
  </Card>

  <Card title="Shopify" icon="cart-shopping" href="/getting_started/integrations/kestra/shopify">
    E-commerce platform. Native `updatedAtMin` incremental sync, webhooks for real-time and deletes.
  </Card>
</CardGroup>
