homeaboutvideotry it nowpricingdocs
Docs

Getting Started

EXIF data

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.

What is read

When an image is uploaded, Fileboy reads its EXIF data, and the basics of its IPTC and XMP data, from:

  • JPEG (EXIF, XMP, IPTC and the ICC profile)
  • PNG (the eXIf chunk, XMP and the ICC profile)
  • WebP (the EXIF, XMP and ICCP chunks)
  • TIFF, and raw formats built on it such as DNG and NEF
  • HEIF, HEIC and AVIF (the Exif and XMP items, and the colour profile)

You get it two ways:

fields
, a short list of typed, normalised values that mean the same thing whatever camera took the photo, and
raw
, every tag that was read, for anything else.

  • Camera:
    make
    ,
    model
    ,
    lensMake
    ,
    lensModel
    ,
    software
  • Exposure:
    focalLength
    (mm) and its 35 mm equivalent,
    aperture
    (the f-number),
    exposureTime
    (seconds) and
    shutterSpeed
    ("1/250"),
    iso
    ,
    exposureCompensation
    ,
    exposureProgram
    ,
    meteringMode
    ,
    flashFired
    ,
    whiteBalance
  • When:
    dateTaken
    , ISO 8601. It has an offset (
    +01:00
    ) only when the photo records one, in which case
    timezone
    has it too. Otherwise it is the camera's local time, with no zone, exactly as it was recorded.
  • Image:
    orientation
    (1 to 8),
    width
    and
    height
    as recorded,
    colorSpace
    and
    colorProfile
    (the ICC profile's name, such as Display P3)
  • Description:
    title
    ,
    description
    ,
    artist
    ,
    copyright
    ,
    keywords
    ,
    rating
  • Personal data:
    gps
    (latitude, longitude and altitude), the place names
    city
    ,
    state
    ,
    country
    and
    sublocation
    ,
    bodySerialNumber
    ,
    lensSerialNumber
    and
    cameraOwnerName

A field is

null
when the photo does not say. When EXIF and XMP disagree, EXIF wins, then XMP, then IPTC. Raw tags use the EXIF specification's names (as ExifTool shows them), XMP keys look like
dc:title
, and fractions are decimals. Camera makers' private maker notes and the embedded thumbnail are left out.

Read it

From 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 })
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": []
  }
}

status
is
found
,
none
for an image with no metadata, or
unsupported
for files that are not images.
warnings
lists any part of the file that was malformed and skipped. Photos uploaded before Fileboy read EXIF data at upload are read the first time you ask for them.

Who can see it

A 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:

  • The metadata is stored in its own record, next to the file. Only
    GET /files/:id/exif
    with your app's private key and the members of your app in the dashboard can read it.
  • A public key, an upload or read access token and a signed read URL are all refused. No public route carries it: not
    /files/data/:id
    , not the upload response, not webhooks, and not
    format:json
    .
  • ?personal=false
    (
    personal: false
    in the libraries) leaves out GPS, place names, serial numbers and the owner's name, from the fields and the raw tags, when you want to show the rest to your own users.
  • Deleting a file deletes its metadata record with it.
The original file is still the original file. Anyone who can download it can read the location inside it with any photo app. If you serve originals publicly, turn on Remove locations below, or serve transformed images only.

Remove locations at upload

With the app setting

stripLocationOnUpload
on (Settings, Photo location in the dashboard, or the API below), Fileboy takes the GPS position out of every photo before storing it:

  • The EXIF GPS block is emptied, in JPEG, PNG, WebP, TIFF and HEIF files, and every XMP GPS property (
    exif:GPS
    and the newer
    exifEX:GPS
    ) is blanked.
  • The file is not re-encoded: the pixels, the colour profile and every other tag stay exactly as they were, and the file keeps its size. The one exception is compressed XMP in a PNG: it is rewritten uncompressed without the location, or removed if it cannot be read.
  • Fileboy reads the photo back before storing it. If a location can still be read, the upload is refused with
    422 location_not_removed
    rather than stored with it.
  • The stored file's
    hash
    is of the stored bytes, so it no longer matches the hash of the photo on the uploader's device.
  • Place names typed into IPTC or XMP (city, country) are kept, since they are part of the caption. Files uploaded before you turn it on keep their location.
# 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}'

Transformed images

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.

Damaged and hostile files

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
.

EXIF data

What is readRead itWho can see itRemove locations at uploadTransformed imagesDamaged and hostile files
hello@fileboy.io

Fileboy

HomeAboutPricingChangelog
© Copyright 2026, CD2 Solutions Ltd.
Terms and ConditionsPrivacy Policy