Meetily
Automation APIAutomation recipes

Import a recording made elsewhere

Upload an audio file recorded outside Meetily and get a transcript and summary from it, over HTTP or the CLI.

If you have an audio file recorded somewhere else - your phone, another app, a colleague - you can bring it into Meetily for transcription, then request a summary. An API import does not generate one automatically.

Import is available over HTTP and the CLI

Use the raw HTTP upload below or meetily-pro jobs import --file <path>. There is deliberately no MCP import tool because importing would give an assistant filesystem reach. Import needs a write-scoped token.

Before you start

On a first-time setup, go to Settings > PRO, find the Integrations card, choose Turn on, then choose Open Integrations. See Enable & connect. The examples assume the default loopback address http://127.0.0.1:8420.

Step 1 — upload the file

Send POST /v1/jobs/import with a filename query parameter and the raw file bytes as the body (application/octet-stream). It returns 202 with a job_id.

curl -s -X POST "http://127.0.0.1:8420/v1/jobs/import?filename=standup.m4a" \
  -H "Authorization: Bearer $MEETILY_PRO_TOKEN" \
  -H "content-type: application/octet-stream" \
  --data-binary @standup.m4a
# -> {"job_id":"job-abc123"}

The CLI sends the same raw upload:

meetily-pro jobs import --file standup.m4a

Accepted extensions: mp4, m4a, wav, mp3, flac, ogg, aac, mkv, webm, wma. Only the extension is read from filename; the bytes are the body. Optional query params: title, language, model, provider.

Per-file and budget limits

Each file is capped at 2 GB (413 payload_too_large above that). Imports also share an aggregate byte, count, and memory budget across all in-flight uploads; when it's full, a new import is refused with 429 too_many_requests and code import_budget_full plus a Retry-After. Retry after the running imports drain.

Step 2 — wait for the job

Poll GET /v1/jobs/{id} using the returned job_id until its state is succeeded. Copy its meeting_id for the next step. If it reaches failed or cancelled, stop; don't request a summary.

curl -s http://127.0.0.1:8420/v1/jobs/JOB_ID \
  -H "Authorization: Bearer $MEETILY_PRO_TOKEN"
# -> {"id":"job-abc123","kind":"import","state":"running","meeting_id":null, ...}

The terminal success state is `succeeded`, not `completed`

A job's state ends at succeeded (or failed/cancelled). There is no completed state - polling for one loops forever. (job.completed is the name of the webhook event, which is a separate thing from the job's state field.)

Instead of polling, you can hold one connection open and let the server tell you the moment it finishes:

curl -N -s "http://127.0.0.1:8420/v1/jobs/JOB_ID/wait?timeout=1800" \
  -H "Authorization: Bearer $MEETILY_PRO_TOKEN"

This is a Server-Sent-Events stream that emits exactly one event, then closes. On timeout it emits a single timeout event rather than an HTTP error.

Step 3 — read the summary

Once the import succeeds, request summary generation for its meeting_id with a write-scoped token. Configure a summary provider in Meetily first.

curl -fsS -X POST http://127.0.0.1:8420/v1/meetings/MEETING_ID/summary/regenerate \
  -H "Authorization: Bearer $MEETILY_PRO_TOKEN" \
  -H "content-type: application/json" \
  -d '{}'
# -> {"operation_id":"op-...","status_url":"/v1/meetings/MEETING_ID/summary/operations/op-...", ...}

Poll the returned status_url until its state is completed, then read the summary. If the operation ends without completing, don't treat any previously saved summary as the result of this request.

curl -fsS http://127.0.0.1:8420/v1/meetings/MEETING_ID/summary/operations/OPERATION_ID \
  -H "Authorization: Bearer $MEETILY_PRO_TOKEN"
# -> {"operation_id":"op-...","state":"completed","terminal":true, ...}

curl -fsS http://127.0.0.1:8420/v1/meetings/MEETING_ID/summary \
  -H "Authorization: Bearer $MEETILY_PRO_TOKEN"

The optional regenerate fields (model, model_name, template_id, language) fall back to the app's stored configuration.

Good to know

No pause, only cancel

Import jobs cannot be paused or resumed - POST /v1/jobs/{id}/pause on an import returns 409 import_not_pausable. You can cancel a running one with POST /v1/jobs/{id}/cancel, but to change the file or filename you cancel and re-upload rather than editing the job in place.

  • If an import fails, the reason is on the job's error field (path-redacted).
  • See Meetily APIs for the full jobs and meetings route surface.

Last updated on

On this page