דילוג לתוכן
תיעוד ה־API

The Reely API

A talking-head video in, a Hebrew reel out: captions, an opening title, music and dead air removed, in every format. The price is known before anything is charged, and test keys are free.

Base URL
https://app.reely.co.il/api/v1
Authentication
Authorization: Bearer rly_…
Money
In agorot: 1320 is ₪13.20

Test keys and live keys

A test key (rly_test_…) is free: it renders a small watermarked reel without music, B-roll or narration, up to 20 renders a day. A live key (rly_live_…) spends your balance, at the same prices as the app.

A key is shown once, when it's made. Keep it in an environment variable, never in code or a browser. Make a key

Your first call

GET /v1/me returns the account behind the key. If it answers, you're connected.

Who am I

export REELY_API_KEY='rly_test_…'

curl 'https://app.reely.co.il/api/v1/me' \
  -H "Authorization: Bearer $REELY_API_KEY"

From a video to a reel

  1. Upload the file

    Ask for an upload URL, then PUT the file to it with the headers in headers. Up to 500 MB of MP4, MOV or WebM. On a shaky connection, multipart: true returns a URL for each 16 MB part.

    An upload URL

    curl -X POST 'https://app.reely.co.il/api/v1/uploads' \
      -H "Authorization: Bearer $REELY_API_KEY" \
      -H "Idempotency-Key: $(uuidgen)" \
      -H "Content-Type: application/json" \
      -d '{
      "filename": "talk.mp4",
      "size_bytes": 48213504,
      "content_type": "video/mp4"
    }'

    Send the file

    curl -X PUT "$UPLOAD_URL" \
      -H "Content-Type: video/mp4" \
      --data-binary @talk.mp4
  2. Create the video

    POST /v1/videos with the upload_id. Reely checks the file, transcribes the Hebrew and suggests titles. It's free.

    A video from the upload

    curl -X POST 'https://app.reely.co.il/api/v1/videos' \
      -H "Authorization: Bearer $REELY_API_KEY" \
      -H "Idempotency-Key: $(uuidgen)" \
      -H "Content-Type: application/json" \
      -d '{
      "upload_id": "vid_8f14e45f-ceea-4e7a-9b1c-2f7a0c3d9e61"
    }'
  3. Wait until it's ready

    Poll GET /v1/videos/{video_id} every few seconds until status is ready. The transcript waits at /transcription.

    The video's state

    curl 'https://app.reely.co.il/api/v1/videos/vid_8f14e45f-ceea-4e7a-9b1c-2f7a0c3d9e61' \
      -H "Authorization: Bearer $REELY_API_KEY"
  4. Get the price

    POST /v1/renders/estimate returns the exact price, from the finished reel's length and the extras. Show it before going on.

    Estimate

    curl -X POST 'https://app.reely.co.il/api/v1/renders/estimate' \
      -H "Authorization: Bearer $REELY_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "video_id": "vid_8f14e45f-ceea-4e7a-9b1c-2f7a0c3d9e61",
      "style": "karaoke",
      "extras": {
        "broll": {
          "on": true
        }
      }
    }'
  5. Render at that price

    POST /v1/renders with the estimate's expected_amount_agorot and an Idempotency-Key. The amount is held now, charged when the reel is done, and released if it fails. If the price changed meanwhile, nothing is charged and the answer is 409 price-changed with the new price.

    Render

    curl -X POST 'https://app.reely.co.il/api/v1/renders' \
      -H "Authorization: Bearer $REELY_API_KEY" \
      -H "Idempotency-Key: $(uuidgen)" \
      -H "Content-Type: application/json" \
      -d '{
      "video_id": "vid_8f14e45f-ceea-4e7a-9b1c-2f7a0c3d9e61",
      "expected_amount_agorot": 1320,
      "style": "karaoke",
      "hook": "שלוש טעויות שעולות לכם כסף",
      "extras": {
        "broll": {
          "on": true
        }
      }
    }'
  6. Download

    Poll GET /v1/renders/{render_id} until status is done, then download download_url. /formats makes 4:5, 1:1, 16:9 and 4:3 for free, and /captions.srt returns the captions.

    The render's state

    curl 'https://app.reely.co.il/api/v1/renders/ren_c9f0f895-fb98-4b91-8f2e-6d1b7a3c4e52' \
      -H "Authorization: Bearer $REELY_API_KEY"

Retries without double charges

Every call that makes something takes an Idempotency-Key: a unique string per request, such as a UUID. Rendering requires one. If the connection drops, send the same request with the same key: you get the first answer, and nothing is charged twice. The same key with a different request returns 422 idempotency-key-reused.

Errors

Every error is application/problem+json (RFC 9457): a stable type that links to its explanation, an English title, a Hebrew detail you can show your users, and a call_id to find in your call log. All errors (in Hebrew).

Rates, budgets and limits

  • 120 calls a minute per key, 30 of them calls that spend. Every answer carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset; past the limit you get 429 with Retry-After.
  • A project has a monthly budget. You're notified at 80% and 100%, and once it's spent, calls that spend stop before anything is charged.
  • A key can have a lifetime spending limit and an expiry. Rotating a key keeps the old one working for 24 hours, so you have time to switch.

Next

The reference lists every route and field (headings in Hebrew, fields in English), and openapi.json is the OpenAPI 3.1 document for generating a client.