API

Send with the API

A file on disk is create, upload, finish. A public URL is one call. Both return a pickup link. Ask for the inbox and the file lands on your address too.

Pull a public link

Don’t download it just to send it. POST /api/v1/links with a public URL. Their host, then ours: Pink Jeepney fetches the file once and the response is a normal pickup link. No login, no account connection, no OAuth.

curl -X POST https://www.pinkjeepney.com/api/v1/links \
  -H "Authorization: Bearer $PINK_JEEPNEY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/file.zip","note":"From their Drive","recipientEmail":"annie@example.com"}'
  • url is required. note, password, to, recipientEmail, burnAfterDownload, and inbox are optional. to is a handle or an email. A handle, or an email that already has an address, lands in their inbox. inbox: true puts the file in your own inbox. Any other email is mailed the link.
  • The response has link, id, name, and size. mailed is false when the email cannot leave, and mailError says to copy the link.
  • A direct S3 or R2 URL works. A Dropbox link anyone can open works. A Drive file shared as anyone with the link works.
  • A public Drive folder becomes one send, up to 20 files. A page or a login returns an error. The API does not sign into Drive, Dropbox, OneDrive, OneNote, or AWS.
  • The file has to fit the plan’s transfer size.

An 8 GB movie you already have

Create the send with the real size. The response includes every upload URL, 512 MB each. An 8 GB file is 16 URLs. You do not ask for the next batch.

curl -X POST https://www.pinkjeepney.com/api/v1/transfers \
  -H "Authorization: Bearer $PINK_JEEPNEY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"files":[{"name":"movie.mp4","size":8589934592,"contentType":"video/mp4"}]}'

Each part has partNumber, start, end, and url. PUT the bytes from start up to end, with Content-Type application/octet-stream. Save the ETag. One file does not need a fileId on the way back.

curl -X POST https://www.pinkjeepney.com/api/v1/transfers/ID/finish \
  -H "Authorization: Bearer $PINK_JEEPNEY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"parts":[{"partNumber":1,"etag":"ETAG"}]}'

Send every part in that one list. The response is the live pickup link. Optional fields on create: note, password, to, recipientEmail, burnAfterDownload. to is a handle or an email. A handle, or an email that already has an address, lands in their inbox and the response includes sentTo. Any other email is mailed the link. A password is not part of the link. If mail cannot leave, mailed is false and you still have the link. If that movie is already a public URL, use /api/v1/links instead and skip the parts.

A small file

Up to 20 MB, you can skip the part URLs and PUT the whole file, then finish with an empty body. The Content-Length must match the size you declared.

curl -X PUT https://www.pinkjeepney.com/api/v1/transfers/ID/files/FILE_ID \
  -H "Authorization: Bearer $PINK_JEEPNEY_TOKEN" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @notes.txt

curl -X POST https://www.pinkjeepney.com/api/v1/transfers/ID/finish \
  -H "Authorization: Bearer $PINK_JEEPNEY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'

More than one file

The create response lists a parts array per file. On finish, include fileId on each part, or send files: [{ fileId, parts }].