Skip to main content
These recipes use curl and jq with a token in NEBYOULOUS_TOKEN (see Authentication). Every request and response shape is in the endpoint reference.

Upload frames

Files never pass through the API. You ask for presigned URLs, upload straight to storage, then tell the API the uploads finished.
1

Create an integration set

2

Presign the uploads

Send up to 500 files per call. relativePath is where the file lands in the set, and clientId is any string you use to match results to files.
Each result has ok, plus assetId and uploadUrl on success or error on failure. One bad item doesn’t fail the batch. On Linux, use stat -c%s instead of stat -f%z.
3

Upload to storage

PUT the file to uploadUrl with the same Content-Type you presigned. The URL expires after an hour.
4

Mark the uploads complete

The asset’s status moves from PRESIGNED to UPLOADED. Until then it doesn’t show up in the set.
nebyoulous sync does all of this for a whole folder, with dedupe, batching, and resume. Reach for the API when you’re building your own uploader.

Stack and download the master

1

Get a recommended config

The API looks at the set’s frames and proposes frame groups (light, dark, flat, bias, darkflat) and a staged stacking config.
Edit recommend.json if you want different frames or settings.
2

Submit the stack

Only groups is required. The API fills in and clamps any config you leave out.
The response is 202 with the job in PENDING.
3

Poll until it finishes

A job moves through PENDING and RUNNING to READY, FAILED, or CANCELLED. On FAILED, job.errorMessage says why.
4

Download the master

When the job is READY, job.downloadUrl is a presigned link to the master FITS.
Frame analysis (/analyses), frame QA (/frame-qa), and exports (/export-jobs) follow the same pattern: submit, poll the job, then read the result. See Stacking and analysis and Exports in the sidebar.