Fileboy reads the camera, lens, exposure settings, date taken and location from every photo you upload, and keeps it private to your team and your server.
When an image is uploaded, Fileboy reads its EXIF data, and the basics of its IPTC and XMP data, from:
You get it two ways:
fieldsrawmakemodellensMakelensModelsoftwarefocalLengthapertureexposureTimeshutterSpeedisoexposureCompensationexposureProgrammeteringModeflashFiredwhiteBalancedateTaken+01:00timezoneorientationwidthheightcolorSpacecolorProfiletitledescriptionartistcopyrightkeywordsratinggpscitystatecountrysublocationbodySerialNumberlensSerialNumbercameraOwnerNameA field is
nulldc:titleFrom your server, with the private key. The dashboard shows the same data on each file's Metadata tab, with a map link for the location.
// needs the private key: the answer can hold the GPS position and serial numbers
const exif = await fileboy.getFileExif(file.id)
exif.fields.model // "iPhone 15 Pro"
exif.fields.shutterSpeed // "1/60"
exif.fields.dateTaken // "2026-02-19T14:22:37.146-08:00"
exif.fields.gps // { latitude: 51.5007, longitude: -0.1246, altitude: 13.21 } or null
// without GPS, place names, serial numbers or the owner, to show your own users
const shareable = await fileboy.getFileExif(file.id, { personal: false })# needs the private key: the answer can hold the GPS position and serial numbers
exif = fileboy.fetch_file_exif(file.id)
exif.fields.model # => "iPhone 15 Pro"
exif.fields.date_taken # => "2026-02-19T14:22:37.146-08:00"
exif.fields.gps&.latitude # => 51.5007
shareable = fileboy.fetch_file_exif(file.id, personal: false)# needs the private key: the answer can hold the GPS position and serial numbers
exif = client.get_file_exif(file.id)
exif.fields.model # "iPhone 15 Pro"
exif.fields.date_taken # "2026-02-19T14:22:37.146-08:00"
exif.fields.gps # ExifGps(latitude=51.5007, longitude=-0.1246, altitude=13.21) or None
shareable = client.get_file_exif(file.id, personal=False)// needs the private key: the answer can hold the GPS position and serial numbers
$exif = $fileboy->getFileExif($file->id);
echo $exif->fields->model; // iPhone 15 Pro
echo $exif->fields->dateTaken; // 2026-02-19T14:22:37.146-08:00
$exif->fields->gps?->latitude; // 51.5007, or null
$shareable = $fileboy->getFileExif($file->id, personal: false);curl https://api.fileboy.io/files/FILE_ID/exif \
-H "Authorization: token YOUR_SIGNED_TOKEN"
# without the personal data
curl "https://api.fileboy.io/files/FILE_ID/exif?personal=false" \
-H "Authorization: token YOUR_SIGNED_TOKEN"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55{ "data": { "fileId": "2a860257-ecf9-424a-846e-00ab68e2fd58", "status": "found", "format": "heif", "extractedAt": "2026-11-14T10:00:00Z", "locationRemoved": false, "personalData": true, "fields": { "make": "Apple", "model": "iPhone 15 Pro", "lensMake": "Apple", "lensModel": "iPhone 15 Pro back triple camera 6.765mm f/1.78", "focalLength": 6.76, "focalLength35mm": 35, "aperture": 1.78, "exposureTime": 0.016666667, "shutterSpeed": "1/60", "iso": 400, "exposureCompensation": 0, "exposureProgram": "Program AE", "meteringMode": "Multi-segment", "flashFired": false, "whiteBalance": "Auto", "dateTaken": "2026-02-19T14:22:37.146-08:00", "timezone": "-08:00", "orientation": 1, "width": 5712, "height": 4284, "software": "26.3", "colorSpace": "Uncalibrated", "colorProfile": "Display P3", "title": null, "description": null, "artist": null, "copyright": null, "keywords": [], "rating": null, "gps": { "latitude": 51.5007, "longitude": -0.1246, "altitude": 13.21 }, "city": null, "state": null, "country": null, "sublocation": null, "bodySerialNumber": null, "lensSerialNumber": null, "cameraOwnerName": null }, "raw": { "exif": { "Make": "Apple", "LensModel": "iPhone 15 Pro back triple camera 6.765mm f/1.78", "GPSLatitude": [51, 30, 2.52], "...": "..." }, "iptc": {}, "xmp": {} }, "warnings": [] } }
statusfoundnoneunsupportedwarningsA photo's location and its camera's serial numbers can identify where someone lives and which device is theirs, so Fileboy treats them as personal data:
GET /files/:id/exif/files/data/:idformat:json?personal=falsepersonal: falseWith the app setting
stripLocationOnUploadexif:GPSexifEX:GPS422 location_not_removedhash# remove the GPS position from every photo uploaded from now on
curl -X PATCH https://api.fileboy.io/app/settings \
-H "Authorization: token YOUR_SIGNED_TOKEN" \
-H "Content-Type: application/json" \
-d '{"stripLocationOnUpload": true}'Every image transform re-encodes the image, which drops all of its metadata: EXIF (with the location and serial numbers), XMP, IPTC and the ICC colour profile. The strip transform does only that, when you want nothing else changed. Orientation is applied first, so photos still show the right way up. Images in a wide-gamut profile such as Display P3 lose the profile too, so browsers show them as sRGB and very saturated colours can look a little flatter.
Reading is bounded: every offset is checked, loops in the file are noticed rather than followed, and the number of tags and bytes read is capped, so a malformed or deliberately broken photo never slows or fails an upload. What can be read is returned, and the rest is reported in
warnings