# העלאות

> העלאת תמונות, וידאו ואודיו עם POST /v1/upload, העתקת קבצים מכתובת URL, ייבוא סרטונים מקישורים, קיצוץ מדיה שמורה, חיפוש בספרייה וקישור לקובץ.

Source: https://nodaro.ai/he/docs/developers/api/uploads

**העלאות** מכניסות תמונות, וידאו ואודיו משלכם לאחסון של Nodaro, כדי שכל רכיב יוכל להשתמש בהם לפי הכתובת שלהם. הנתיב `POST /v1/upload` שומר קובץ אחד ומחזיר את הכתובת שלו. נתיבים אחרים מעתיקים קובץ מכתובת URL, מייבאים סרטון מרשת חברתית, מקצצים קובץ שמור בחינם או מחזירים את המדיה ששמרתם.

## נקודות קצה
| שיטה | נתיב | מה היא עושה |
| --- | --- | --- |
| `POST` | `/v1/upload` | העלאת קובץ אחד, בפורמט multipart form data. |
| `POST` | `/v1/upload-json` | שמירת מסמך JSON, עד 25 MB, וקבלת הכתובת הציבורית שלו. למשל, מצב העיצוב של עורך תמונות בשביל [תמונה ערוכה](https://nodaro.ai/docs/developers/api/jobs#record-an-edited-image). קשה לנחש את הכתובת, אבל היא ציבורית, ולכן לעולם אל תשמרו סוד במסמך כזה. |
| `POST` | `/v1/save-to-storage` | העתקת קובץ מכתובת URL לאחסון שלכם, כמשימה. |
| `POST` | `/v1/download-video` | ייבוא סרטון מרשת חברתית או מקישור ישיר לסרטון. |
| `GET` | `/v1/download-video/progress/:downloadId` | ההתקדמות של הייבוא, כאירועי שרת (SSE). |
| `POST` | `/v1/video-metadata` | קריאת משך הסרטון, הגודל והכותרת שלו בלי להוריד אותו. |
| `POST` | `/v1/media/process` | קיצוץ או חיתוך של קובץ וידאו או אודיו שמור. הנתיב חינמי וסינכרוני. |
| `POST` | `/v1/media/import-url` | העתקת תמונה מכתובת אינטרנט לאחסון שלכם. |
| `POST` | `/v1/media/discard` | מחיקת קובץ שיצרתם זה עתה ושכבר אין לכם צורך בו. |
| `GET` | `/v1/library` | ספריית המדיה שלכם, מהחדש לישן, עם חיפוש ומסננים. |
| `POST` | `/v1/library/save-generated` | שמירה של אחד הקבצים שלכם בספרייה שלכם. |

## העלאת קובץ
שלחו את הקובץ כ-multipart form data בשדה `file`. אפשר לשלוח גם `type`, עם הערך `image`, `video` או `audio`.

**curl**

```bash
curl -s -X POST https://app.nodaro.ai/v1/upload \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -F "file=@portrait.png;type=image/png" \
  -F "type=image"
```

```json
{
"data": {
"url": "https://…/portrait.png",
"assetId": "5d6e7f80-91a2-4b3c-8d4e-5f60718293a4",
"thumbnailUrl": "https://…/portrait-thumb.webp",
"category": "image",
"filename": "portrait.png",
"mimeType": "image/png",
"sizeBytes": 1482233,
"r2Key": "…/portrait.png"
}
}
```

**TypeScript SDK**

```ts
// In a browser, file comes from an <input type="file">.
// In Node 20 or newer, build it from bytes:

const file = new File([await readFile('portrait.png')], 'portrait.png', { type: 'image/png' })
const upload = await client.uploads.upload(file)
console.log(upload.url) // pass it as imageUrl, videoUrl or audioUrl
```

| שדה | משמעות |
| --- | --- |
| `url` | הכתובת הציבורית של הקובץ השמור. אפשר להשתמש בה בכל רכיב. |
| `assetId` | המזהה של הקובץ באחסון שלכם. |
| `thumbnailUrl` | תמונה ממוזערת לתמונות ולווידאו, או `null` לאודיו. |
| `category` | `image`, `video` או `audio`, לפי הסיווג של השרת. |
| `filename` | שם התצוגה של הקובץ. |
| `mimeType` | סוג הקובץ שהשרת קבע. פרטים בהמשך. |
| `sizeBytes` | הגודל של הקובץ השמור, בבייטים. |
| `r2Key` | המפתח של הקובץ באחסון. |

ב-CLI אין פקודת העלאה. כדי להעתיק מהטרמינל לאחסון שלכם קובץ שכבר נמצא ברשת, השתמשו בפקודה `nodaro media save <url>`.

### פורמטים וסוגי קבצים
| מדיה | פורמטים |
| --- | --- |
| תמונה | PNG, JPEG, WebP, GIF, AVIF, HEIC, HEIF. עד 25 MB. |
| וידאו | MP4, MOV, WebM, AVI. עד 500 MB. |
| אודיו | MP3, WAV, M4A ו-AAC, OGG, WebM, FLAC. עד 50 MB. |

לכל סוג מדיה יש מגבלת גודל משלו. הסוג שהלקוח שלכם מצהיר עליו לא חייב להיות הסוג התקני, כי השרת מברר את הסוג האמיתי לפני שהוא בודק את הקובץ:

- **פרמטרים מוסרים.** הסוג `audio/webm;codecs=opus` הופך ל-`audio/webm`.
- **כתיבים חלופיים נפוצים ממופים לסוג התקני.** הסוג `audio/vnd.dlna.adts`, ש-Windows משתמש בו לקובץ `.aac` רגיל, הופך ל-`audio/aac`, `image/jpg` הופך ל-`image/jpeg` ו-`video/mov` הופך ל-`video/quicktime`.
- **סוג שלא אומר כלום נקבע לפי שם הקובץ.** עם `application/octet-stream`, או בלי סוג בכלל, הסיומת קובעת: הקובץ `clip.mp4` נשמר כ-`video/mp4`.

סוג שעדיין לא תואם לאף פורמט שמתקבל נדחה עם `400 validation_error`, עם רשימת הפורמטים שמתקבלים. הסוג שהשרת קבע חוזר ב-`mimeType`, והקובץ מוגש איתו.

**תמונות HEIC, HEIF ו-AVIF מומרות לפני שהן נשמרות.** מעט דפדפנים מציגים את הפורמטים האלה, ומודלי התמונה לא מקבלים אותם. כל דרך העלאה של תמונות שומרת קובץ כזה כ-JPEG, או כ-PNG כשיש בתמונה שקיפות, והשדה `mimeType` מציין את הסוג השמור. דרכי ההעלאה האלה הן `POST /v1/upload`, `POST /v1/upload/image`, ההעלאה שמאחורי כלי ה-MCP `prepare_image_upload` ו-`request_image_upload` והייבוא בצד השרת של כתובת תמונה. דרך העלאה שנתנה את הכתובת של הקובץ לפני ההעלאה שומרת על הכתובת הזו, ורק סוג התוכן של הקובץ משתנה. ההמרה כוללת גם קובצי AVIF של 10 ביט ותמונות HEIC מ-iPhone. את שני אלה קורא מפענח שלא שומר על שקיפות, ולכן אזור שקוף בהם יוצא אטום. קובץ AVIF של 8 ביט שומר על השקיפות שלו. קובץ שאי אפשר לפענח בכלל נדחה עם `400`.

**סרטוני MP4 ו-MOV נשמרים עם האינדקס שלהם בתחילת הקובץ.** בהקלטה מ-OBS או מטלפון, האינדקס הזה נמצא לרוב בסוף הקובץ, ולכן בקובץ גדול, הקפיצה הראשונה לנקודה אחרת בסרטון איטית. כל דרך העלאה של וידאו כותבת קובץ כזה מחדש פעם אחת, לפני שהוא נשמר, ומעתיקה את הזרמים שלו לקונטיינר חדש. שום דבר לא מקודד מחדש: התמונה והסאונד נשארים זהים. קובץ שהאינדקס שלו כבר בתחילתו, או קובץ שאי אפשר לוודא שהכתיבה מחדש שלו תקינה, נשמר בדיוק כפי שנשלח. קובץ שנכתב מחדש עטוף שוב, ולכן הגודל השמור יכול להיות שונה מעט מהבייטים ששלחתם. השדה `sizeBytes` הוא תמיד האורך של הקובץ השמור, ולכן אל תשוו אותו לגודל של הקובץ המקומי שלכם או ל-checksum שלו.

### כשהעלאה נדחית
| סטטוס | קוד | משמעות |
| --- | --- | --- |
| 400 | `validation_error` | הקובץ לא בפורמט שמתקבל, או שקובץ תמונה או אודיו חורג ממגבלת הגודל שלו. |
| 413 | `storage_limit_exceeded` | נפח האחסון שלכם מלא. ה-SDK זורק `StorageExceededError`, עם הקוד ב-`reason` והשימוש והמגבלה שלכם ב-`details`: `usedBytes`, `quotaBytes`, `remainingBytes` ו-`tier`. |
| 422 | `upload_blocked` | מדיניות ההעלאות של הפריסה דחתה את הקובץ לפני שהוא נשמר. הציגו את ה-`message` למשתמש שלכם כמו שהוא. רק בפריסות שיש להן מדיניות כזו. |

## שימוש בכתובת URL במקום העלאה
רוב הנתיבים מקבלים מדיה לפי כתובת URL, כגון `imageUrl`, `videoUrl`, `audioUrl` ו-`referenceImageUrls`, ולכן אין צורך להעלות קובץ שכבר נמצא ברשת. הכתובת חייבת להיות כתובת `http` או `https` ציבורית: כתובת שמפנה לכתובת ברשת פרטית, או שמשתמשת בסכמה אחרת, נדחית.

העתיקו את הקובץ לאחסון של Nodaro כשהכתובת זמנית, כמו קישור חתום שתוקפו מוגבל, או כשאתם רוצים שהקובץ יישאר זמין:

**curl**

```bash
curl -s -X POST https://app.nodaro.ai/v1/save-to-storage \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mediaUrl": "https://example.com/clip.mp4", "filename": "clip.mp4", "mediaType": "video"}'
# {"jobId":"…"}  poll the job; its output carries the stored file
```

**TypeScript SDK**

```ts
const { jobId } = await client.media.saveToStorage({
mediaUrl: 'https://example.com/clip.mp4',
filename: 'clip.mp4',
mediaType: 'video',
})
```

**CLI**

```bash
nodaro media save https://example.com/clip.mp4 --filename clip.mp4 --type video --watch
```

בתהליך, העבירו את הכתובת של קובץ שהועלה לאחד מהרכיבים [העלאת תמונה](https://nodaro.ai/docs/nodes/image/upload-image), [העלאת וידאו](https://nodaro.ai/docs/nodes/video/upload-video) או [העלאת אודיו](https://nodaro.ai/docs/nodes/audio/upload-audio) דרך הקלטים של ההרצה. בכל הרצה אפשר לדרוס את שדות ה-`url` של המדיה ברכיבי הקלט. ראו בדף ה-API [הרצת תהליך עם ערכי קלט חדשים](https://nodaro.ai/docs/developers/api/workflows#run-a-workflow-with-new-input-values).

## ייבוא סרטון מרשת חברתית
הנתיב `POST /v1/download-video` מייבא לאחסון שלכם את הסרטון שמאחורי קישור לדף של סרטון, או סרטון מקישור ישיר לקובץ וידאו. שלחו את אישור זכויות התוכן של הקישור בשדה `confirmationId` (ראו את דף ה-API [זכויות תוכן](https://nodaro.ai/docs/developers/api/content-rights)). הנתיב מחזיר `downloadId`, ולא מזהה משימה:

```json
{ "url": "https://youtu.be/XXXX", "maxHeight": 720, "sectionStartSec": 30, "sectionEndSec": 90 }
```

- השדה `maxHeight` מגביל את הרזולוציה; השמיטו אותו כדי לקבל את הרזולוציה הטובה ביותר שזמינה. השדות `sectionStartSec` ו-`sectionEndSec` מורידים רק את החלק הזה של הסרטון, עם כ-3 שניות נוספות בכל צד, כי החיתוך נופל על פריימי מפתח. שלחו את שניהם או אף אחד מהם, וקצצו את התוצאה כשצריך חיתוך מדויק. עם `exactSection: true`, החלק נחתך במקום זאת בדיוק בטווח הזה, בלי שוליים.
- ייבוא של סרטון בלי רצועת אודיו נכשל, אלא אם שולחים `requireAudio: false`.
- כל חשבון יכול להריץ 4 ייבואים בבת אחת. ייבוא חמישי נדחה עם `429 too_many_downloads`.
- הנתיב `GET /v1/download-video/progress/:downloadId` מזרים את ההתקדמות כאירועי שרת (SSE), בערך פעמיים בשנייה: `{ phase, percent, videoUrl?, thumbnailUrl?, error? }`. הזרם מסתיים כשהסטטוס של הייבוא הוא `completed`, עם ה-`videoUrl` השמור, או `failed`, עם `error`. ההתקדמות נשמרת רק לזמן קצר אחרי שהייבוא מסתיים, ולכן התחילו לקרוא אותה מיד.
- הסרטון המוגמר נשמר בספרייה שלכם.

כדי לבדוק סרטון לפני שמייבאים אותו, הנתיב `POST /v1/video-metadata` עם `{ url }` קורא את משך הסרטון, את הגודל ואת הכותרת שלו בלי להוריד אותו. מהטרמינל: הפקודות `nodaro media download <url> --max-height 720 --watch` ו-`nodaro media metadata <url>`. ראו את דף ה-API [קול ומדיה](https://nodaro.ai/docs/developers/api/voice-and-media) לשאר כלי המדיה.

## קיצוץ או חיתוך של קובץ שמור
הנתיב `POST /v1/media/process` מקצץ או חותך קובץ וידאו או אודיו שמור. הנתיב חינמי ועונה מיד, בלי משימה:

```json
{
"sourceUrl": "https://…/interview.mp4",
"type": "video",
"trim": { "startTime": 12.5, "endTime": 48 },
"crop": { "x": 0, "y": 0, "width": 1080, "height": 1080 }
}
```

התגובה היא `{ "data": { url, thumbnailUrl, assetId, sizeBytes, mimeType, metadata } }`. השדה `format` קובע את פורמט הפלט: לווידאו `mp4` או `webm`, לאודיו `mp3`, `wav`, `m4a` או `aac`. עם `deleteSource: true`, קובץ המקור נמחק אחר כך אם הוא שלכם ושום דבר אחר לא משתמש בו, כך שהגרסה המקוצצת מחליפה את המקור. ב-SDK, קראו ל-`client.media.process(input)`. כדי לקצץ בתוך תהליך, השתמשו ברכיב [קיצוץ וידאו](https://nodaro.ai/docs/nodes/video/trim-video), שעולה קרדיטים.

## ייבוא תמונה מכתובת אינטרנט
הנתיב `POST /v1/media/import-url` עם גוף הבקשה `{ "url": "https://…" }` מעתיק תמונה מכתובת אינטרנט לאחסון שלכם. הכתובת חייבת להיות `http` או `https` ולא פרטית, והגודל המרבי של התמונה הוא 20 MB. הפלטפורמה שומרת את הקובץ רק אם אפשר לפענח אותו כתמונה: JPEG, PNG, WebP או GIF. תמונת HEIC, HEIF או AVIF מומרת ל-JPEG או ל-PNG. העותק השמור נחשב להעלאה שלכם, והוא מוגש כך שאלמנט `<canvas>` בדפדפן יכול לקרוא את הפיקסלים שלו, למשל כדי לחתוך אותו.

התגובה היא `{ "data": { url, thumbnailUrl, assetId, mimeType, sizeBytes, filename, width, height } }`. כשהייבוא נדחה, התשובה היא `400 validation_error` על כתובת או פורמט שלא מתקבלים, `422 fetch_failed` כשאי אפשר להגיע לכתובת ו-`413` כשהתמונה גדולה מ-20 MB (`file_too_large`) או כשנפח האחסון שלכם מלא (`storage_limit_exceeded`). ב-SDK, קראו ל-`client.uploads.importUrl(url)`. רכיב [העלאת תמונה](https://nodaro.ai/docs/nodes/image/upload-image) משתמש בייבוא הזה כשמדביקים קישור לתמונה.

## מחיקת קובץ שכבר אין בו צורך
הנתיב `POST /v1/media/discard` עם גוף הבקשה `{ "url": "https://…" }` מוחק קובץ שיצרתם זה עתה ושכבר אין לכם צורך בו. דוגמאות: הורדה מקישור שהחלפתם לפני שהשתמשתם בה, קטע מקוצץ שהוחלף בקטע חדש יותר ותמונה שייבאתם ואז ביטלתם. זו לא מחיקה כללית. הקובץ נמחק רק אם הוא שלכם, ורק אם `/v1/download-video`, `/v1/media/process` או ייבוא מכתובת URL יצרו אותו. בנוסף, הקובץ צריך להיות בן פחות מ-24 שעות, ואסור שמשימה כלשהי שלכם תשתמש בו, לא כפלט ולא כקלט, כמו ה-`videoUrl` של הרצה.

| תגובה | משמעות |
| --- | --- |
| `{ "data": { "discarded": true } }` | הקובץ נמחק. |
| `{ "data": { "discarded": false } }` | בכתובת הזו לא היה קובץ שלכם: הקובץ כבר נמחק, או שהוא לא שלכם. |
| `409 not_discardable` | הקובץ לא עומד בתנאים שלמעלה. שום דבר לא השתנה. |

ב-SDK, קראו ל-`client.media.discard({ url })`.

## ספריית המדיה שלכם
הנתיב `GET /v1/library` מחזיר את המדיה שלכם, מהחדש לישן. כברירת מחדל הוא מחזיר את הקבצים ששמרתם בספרייה שלכם, ובנוסף את הספרייה המשותפת. עם `owned=true`, הוא מחזיר במקום זאת כל קובץ שבבעלותכם: העלאות ויצירות, בין שנשמרו בספרייה ובין שלא.

| פרמטר שאילתה | משמעות |
| --- | --- |
| `type` | `all` (ברירת המחדל), `image`, `video` או `audio`. |
| `q` | חיפוש: רק הקבצים ששם הקובץ שלהם כולל את כל המילים שב-`q`, עד 5 מילים, בלי הבדל בין אותיות גדולות לקטנות. כל תו נבדק כמו שהוא, ולכן התווים `%`, `_` ו-`*` לא משמשים כתווים כלליים. ערך ריק ב-`q` פירושו שאין חיפוש, והאורך המרבי של `q` הוא 200 תווים. השם הקודם, `search`, עדיין עובד. |
| `owned` | הערך `true` מחזיר כל קובץ שבבעלותכם, במקום תצוגת הספרייה. |
| `source` | רק מדיה מממשק אחד: `internal`, `mcp`, `app`, `cli`, `sdk`, `extension`, `web` או `api`. לקבצים מלפני שהנתון הזה התחיל להירשם אין מקור, ולכן הם מופיעים רק כשמשמיטים את `source`. |
| `limit` | גודל העמוד, 1–100. ברירת המחדל היא 40. |
| `cursor` | הערך `nextCursor` מהעמוד הקודם. |

התגובה היא `{ data, nextCursor, totalCount }`. כל פריט כולל את `id`, `type`, `filename`, `mimeType`, `sizeBytes`, `url`, `thumbnailUrl`, `metadata`, `isLibraryItem`, `uploadSource`, `source`, `sourceDetail`, `jobId` ו-`createdAt`. השדה `jobId` הוא המשימה שיצרה את הקובץ, או `null` בהעלאה. בעמוד האחרון השדה `nextCursor` הוא `null`, והשדה `totalCount`, מספר הקבצים שתואמים, מגיע רק עם העמוד הראשון.

```bash
curl -s "https://app.nodaro.ai/v1/library?owned=true&type=image&q=poster" \
  -H "Authorization: Bearer $NODARO_API_KEY"
```

ב-SDK, קראו ל-`client.library.list({ type: 'image', q: 'poster' })`. כלי ה-MCP `browse_uploads` קורא את התצוגה של `owned=true`, עם אותו חיפוש לפי שם קובץ בארגומנט `search` שלו.

הנתיב `POST /v1/library/save-generated` עם `{ url, type }` שומר קובץ בספרייה שלכם. קובץ באחסון של Nodaro מתקבל רק אם הוא שלכם: אחת היצירות שלכם, קובץ שהעליתם או קובץ בתיקיית ההעלאות שלכם. כל קובץ אחר באחסון של Nodaro נדחה עם `403 forbidden`, בין שהוא קיים ובין שלא. קישור לכל אתר אחר נשמר כמו שהוא.

### שליחת משתמש לקובץ אחד
כדי לשלוח משתמש מחובר לקובץ אחד בספריית הקבצים של האפליקציה, **הקבצים שלי**, צרו קישור ל-`/library` עם אחד משני פרמטרי שאילתה:

| קישור | מה הוא פותח |
| --- | --- |
| `https://app.nodaro.ai/library?job=<jobId>` | הקובץ שהמשימה הזו יצרה: ה-`jobId` שקריאת היצירה שלכם החזירה. |
| `https://app.nodaro.ai/library?asset=<assetId>` | הקובץ הזה: השדה `id` מ-`GET /v1/library?owned=true`. בלי `owned=true`, ברשימה נמצאים גם פריטים מהספרייה המשותפת, שהדף **הקבצים שלי** אף פעם לא מציג. |

- **הדף מחפש, ואז מציג את הקובץ.** הדף מציג ״מחפשים את הקובץ…״, ואז גולל אל הקובץ, מסמן אותו ופותח את התצוגה המקדימה שלו.
- **הדף מחפש בין כ-1,000 הקבצים החדשים ביותר של המשתמש.** קישור לקובץ ישן יותר פותח את הדף **הקבצים שלי** בלי הקובץ.
- **כשאי אפשר להציג את הקובץ, הודעה קצרה מסבירה למה**, והדף נפתח כרגיל: המזהה לא מוכר או לא שייך למשתמש, המשימה עדיין רצה, או שהמשימה נכשלה או לא יצרה קובץ. כשהחיפוש עצמו נכשל, ההודעה מבקשת מהמשתמש לנסות את הקישור שוב.
- **הפרמטר נמחק מהכתובת אחרי שהדף קורא אותו**, ולכן רענון הדף או לחיצה על **חזרה** בדפדפן לא פותחים את הקובץ שוב.
- **משתמש שלא מחובר** מתחבר קודם, ואז מגיע לקובץ. התקנה באירוח עצמי עונה על אותם נתיבים בכתובת שלה.

## העלאה דרך עוזר AI
[שרת ה-MCP](https://nodaro.ai/docs/mcp/tools) מציע שלוש דרכים להעלות, וכל אחת מהן קיימת לתמונות, לאודיו ולווידאו. כולן דורשות את ההרשאה `assets:write`.

| דרך | כלים | איפה היא עובדת |
| --- | --- | --- |
| חלון העלאה בצ׳אט | `upload_image_widget`, `upload_audio_widget`, `upload_video_widget` | Claude.ai בדפדפן. חלון ההעלאה של התמונות מקבל עד 10 קבצים. |
| דף העלאה בדפדפן | `request_image_upload`, `request_audio_upload`, `request_video_upload` | כל לקוח MCP. הכלי מחזיר דף שפותחים בדפדפן, ואת הכתובת הציבורית הסופית של הקובץ. |
| כתובת העלאה חתומה מראש | `prepare_image_upload`, `prepare_audio_upload`, `prepare_video_upload` | לקוחות שיכולים להריץ פקודות shell, כמו Claude Code, Cursor או Cline. שלחו את הקובץ עם `curl -X PUT --data-binary @file`. לא ב-Claude.ai בדפדפן ולא באנדרואיד. |

## שאלות נפוצות

### איך מעלים קובץ ל-Nodaro דרך ה-API?

שלחו בקשת POST /v1/upload בפורמט multipart form data, עם הקובץ בשדה file. בתגובה מופיע השדה url של הקובץ השמור, ואפשר להעביר אותו לכל רכיב בתור imageUrl, videoUrl או audioUrl.

### אילו פורמטים של קבצים אפשר להעלות?

תמונות ב-PNG, ב-JPEG, ב-WebP, ב-GIF, ב-AVIF, ב-HEIC או ב-HEIF, וידאו ב-MP4, ב-MOV, ב-WebM או ב-AVI, ואודיו ב-MP3, ב-WAV, ב-M4A או AAC, ב-OGG, ב-WebM או ב-FLAC. הגודל המרבי של קובץ תמונה הוא 25 MB, של קובץ וידאו 500 MB ושל קובץ אודיו 50 MB.

### האם צריך להעלות קובץ לפני שרכיב יכול להשתמש בו?

לא. רוב הנתיבים מקבלים ישירות כתובת URL ציבורית של http או https. העלו את הקובץ, או העתיקו אותו עם POST /v1/save-to-storage, כשהכתובת פרטית או זמנית, או כשאתם רוצים ש-Nodaro ישמור עותק משלו.

### מה קורה כשנפח האחסון שלי מלא?

ההעלאה נדחית עם 413, וה-SDK זורק StorageExceededError, עם המגבלה שלכם ב-details.quotaBytes. מחקו קבצים שכבר אין לכם צורך בהם, או שחררו מקום, ואז העלו שוב.

### איך שולחים משתמש לקובץ אחד בספריית ה-Nodaro שלו?

צרו קישור לכתובת https://app.nodaro.ai/library עם הפרמטר job ומזהה המשימה, או עם הפרמטר asset ומזהה מ-GET /v1/library?owned=true. הדף מוצא את הקובץ, גולל אליו ופותח את התצוגה המקדימה שלו.

### איך עוזרי AI מעלים קבצים דרך MCP?

שרת ה-MCP מציע שלוש דרכים: חלון העלאה בצ׳אט, דף העלאה בדפדפן וכתובת העלאה חתומה מראש ללקוחות שיכולים להריץ פקודות shell. כל אחת מהן קיימת לתמונות, לאודיו ולווידאו.
