העלאות
העלאת תמונות, וידאו ואודיו עם POST /v1/upload, העתקת קבצים מכתובת URL, ייבוא סרטונים מקישורים, קיצוץ מדיה שמורה, חיפוש בספרייה וקישור לקובץ.
העלאות מכניסות תמונות, וידאו ואודיו משלכם לאחסון של Nodaro, כדי שכל רכיב יוכל להשתמש בהם לפי הכתובת שלהם. הנתיב POST /v1/upload שומר קובץ אחד ומחזיר את הכתובת שלו. נתיבים אחרים מעתיקים קובץ מכתובת URL, מייבאים סרטון מרשת חברתית, מקצצים קובץ שמור בחינם או מחזירים את המדיה ששמרתם.
נקודות קצה
| שיטה | נתיב | מה היא עושה |
|---|---|---|
POST | /v1/upload | העלאת קובץ אחד, בפורמט multipart form data. |
POST | /v1/upload-json | שמירת מסמך JSON, עד 25 MB, וקבלת הכתובת הציבורית שלו. למשל, מצב העיצוב של עורך תמונות בשביל תמונה ערוכה. קשה לנחש את הכתובת, אבל היא ציבורית, ולכן לעולם אל תשמרו סוד במסמך כזה. |
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 -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"{
"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"
}
}// In a browser, file comes from an <input type="file">.
// In Node 20 or newer, build it from bytes:
import { readFile } from 'node:fs/promises'
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 -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 fileconst { jobId } = await client.media.saveToStorage({
mediaUrl: 'https://example.com/clip.mp4',
filename: 'clip.mp4',
mediaType: 'video',
})nodaro media save https://example.com/clip.mp4 --filename clip.mp4 --type video --watchבתהליך, העבירו את הכתובת של קובץ שהועלה לאחד מהרכיבים העלאת תמונה, העלאת וידאו או העלאת אודיו דרך הקלטים של ההרצה. בכל הרצה אפשר לדרוס את שדות ה-url של המדיה ברכיבי הקלט. ראו בדף ה-API הרצת תהליך עם ערכי קלט חדשים.
ייבוא סרטון מרשת חברתית
הנתיב POST /v1/download-video מייבא לאחסון שלכם את הסרטון שמאחורי קישור לדף של סרטון, או סרטון מקישור ישיר לקובץ וידאו. שלחו את אישור זכויות התוכן של הקישור בשדה confirmationId (ראו את דף ה-API זכויות תוכן). הנתיב מחזיר downloadId, ולא מזהה משימה:
{ "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 קול ומדיה לשאר כלי המדיה.
קיצוץ או חיתוך של קובץ שמור
הנתיב POST /v1/media/process מקצץ או חותך קובץ וידאו או אודיו שמור. הנתיב חינמי ועונה מיד, בלי משימה:
{
"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). כדי לקצץ בתוך תהליך, השתמשו ברכיב קיצוץ וידאו, שעולה קרדיטים.
ייבוא תמונה מכתובת אינטרנט
הנתיב 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). רכיב העלאת תמונה משתמש בייבוא הזה כשמדביקים קישור לתמונה.
מחיקת קובץ שכבר אין בו צורך
הנתיב 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, מספר הקבצים שתואמים, מגיע רק עם העמוד הראשון.
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 מציע שלוש דרכים להעלות, וכל אחת מהן קיימת לתמונות, לאודיו ולווידאו. כולן דורשות את ההרשאה 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. כל אחת מהן קיימת לתמונות, לאודיו ולווידאו.
דפים קשורים
רכיבים
קול ומדיה
העלאת תמונה
תהליכים
מדריך כלי ה-MCP
עודכן לאחרונה