Forstify Deep Links

Link: https://app.forstify.de/measure?…  ·  File: .forstify (application/vnd.forstify.measurements+json)

Platform:

Overview

Both work on the device and offline. For synced data on your server, use the External API.

Tip: put your app's name into note. It shows in the measurement and comes back in the shared file.

Quick start

Open this page on a phone or tablet with Forstify installed and tap a button. Each one starts a new measurement with example values.

What the app does

Checks

SituationWhat happens
Not logged inThe app shows the login and continues with the link after the login. A new registration drops the link: open it again once the account is ready.
Forstify not installed, or the link opens in a browserA page with Open in app and the store links opens; the user can close it. The values do not survive installing the app: open the link again from your app afterwards.
Link not usedThe app uses a link right away or after the login. Otherwise it is dropped, also when the app is closed: open the link again.
No method in the linkThe method picker opens; the values apply to the method the user picks.

Rules

Share with app

How users share

In Forstify, the user opens the export of one measurement (or selects several in the list) and taps Share with app (DE: Mit App teilen). The system share dialog opens with the file.

Value
File nameYYYY-MM-DD_<logpile number>.forstify, or YYYY-MM-DD_<n>_measurements.forstify for several
MIME typeapplication/vnd.forstify.measurements+json
iOS type identifierde.forstify.measurements (conforms to public.json)
EncodingUTF-8 JSON

To appear in that dialog, your app registers for the file type as shown below.

Receive on Android

Forstify sends an ACTION_SEND intent with the MIME type above and the file as a content:// URI in EXTRA_STREAM, with read permission granted. Add an intent filter for that MIME type:

<activity android:name=".ForstifyImportActivity" android:exported="true">
  <intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="application/vnd.forstify.measurements+json" />
  </intent-filter>
</activity>
class ForstifyImportActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val uri = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
        val json = uri?.let { contentResolver.openInputStream(it)?.bufferedReader()?.use { reader -> reader.readText() } }
        val file = json?.let { JSONObject(it) }
        if (file == null || file.optString("format") != "forstify.measurements" || file.optInt("version") != 1) {
            finish()
            return
        }
        val measurements = file.getJSONArray("measurements")
        for (i in 0 until measurements.length()) {
            val measurement = measurements.getJSONObject(i)
            val note = measurement.optString("note")          // your reference, if you sent one
            val fm = measurement.getJSONObject("volume").optDouble("fm")
            // …
        }
    }
}

Receive on iOS

Forstify declares the type de.forstify.measurements. Import the type and declare that your app opens it; the share sheet then lists your app for .forstify files. Add to Info.plist:

<key>UTImportedTypeDeclarations</key>
<array>
  <dict>
    <key>UTTypeIdentifier</key><string>de.forstify.measurements</string>
    <key>UTTypeDescription</key><string>Forstify Measurements</string>
    <key>UTTypeConformsTo</key><array><string>public.json</string></array>
    <key>UTTypeTagSpecification</key>
    <dict>
      <key>public.filename-extension</key><array><string>forstify</string></array>
      <key>public.mime-type</key><array><string>application/vnd.forstify.measurements+json</string></array>
    </dict>
  </dict>
</array>
<key>CFBundleDocumentTypes</key>
<array>
  <dict>
    <key>CFBundleTypeName</key><string>Forstify Measurements</string>
    <key>CFBundleTypeRole</key><string>Viewer</string>
    <key>LSHandlerRank</key><string>Alternate</string>
    <key>LSItemContentTypes</key><array><string>de.forstify.measurements</string></array>
  </dict>
</array>
<key>LSSupportsOpeningDocumentsInPlace</key><false/>
// The receiving code for Android is under "Receive on Android".

File format

ForstifyShareFile

FieldTypeDescription
format"forstify.measurements"Always this value; check it before reading
versionnumber1, see Versioning
exportedAtstringISO 8601 UTC, when the file was created
measurementsForstifyShareMeasurement[]One entry per shared measurement

ForstifyShareMeasurement

A value that does not apply to the method is null, never left out. Lists are always arrays, possibly empty.

FieldTypeDescription
idstring | nullId of the measurement (UUID)
serverIdstring | nullId on the Forstify server once synced, else null
createdAtstring | nullISO 8601 UTC
methodMethodCode | nullSee Methods; null for methods without a partner code
numberstring | nullLogpile number
notestring | nullNote
speciesWoodSpecies[]Wood species
assortmentWoodAssortment[]Sortiment, API names (Stammholz, …)
varietyWoodVariety[]Sorte, API names (Lang, …)
quality{ min, max } | nullLowest and highest WoodQuality; equal when the measurement has one quality
volume{ fm, rm }Solid (Fm) and stacked (Rm) cubic metres, up to 3 decimals, each number | null. rm only for sectional, sectional_form and volume_form.
logCountnumber | nullNumber of logs; for volume_form only when the user entered it
logLength{ avg, min, max } | nullLog length in metres, up to 2 decimals
diameter{ min, max } | nullMid diameter in cm under bark, up to 1 decimal. logpile, photo_analysis and single_log_form only.
diameterClasses{ class, logCount, fm }[] | nullLogs and Fm per diameter class, always in the detailed classes (see Enums), so you can merge them into your own classes. logpile, photo_analysis and single_log_form only.
factors{ reduction, conversion } | nullReduction and conversion factor, each number | null. sectional and sectional_form only.
location{ lat, lng } | nullGPS position (WGS 84)
metadataobjectThe ten "further details" fields of the link (forestOwner … inventoryUnit), each string | null

Example file

{
  "format": "forstify.measurements",
  "version": 1,
  "exportedAt": "2026-10-15T09:12:44.000Z",
  "measurements": [
    {
      "id": "6f1d7c2e-3a41-4f4b-9a7e-1b2c3d4e5f60",
      "serverId": null,
      "createdAt": "2026-10-15T08:57:10.000Z",
      "method": "logpile",
      "number": "P-124",
      "note": "MyForestApp",
      "species": ["ki"],
      "assortment": ["Stammholz"],
      "variety": ["Abschnitte"],
      "quality": { "min": "bc", "max": "bc" },
      "volume": { "fm": 12.416, "rm": null },
      "logCount": 38,
      "logLength": { "avg": 5, "min": 5, "max": 5 },
      "diameter": { "min": 18.5, "max": 41.2 },
      "diameterClasses": [
        { "class": "1b2", "logCount": 4, "fm": 0.612 },
        { "class": "2a", "logCount": 11, "fm": 2.144 },
        { "class": "2b", "logCount": 12, "fm": 3.561 },
        { "class": "3a", "logCount": 8, "fm": 3.398 },
        { "class": "4a", "logCount": 3, "fm": 2.701 }
      ],
      "factors": null,
      "location": { "lat": 50.12345, "lng": 8.54321 },
      "metadata": {
        "forestOwner": "Gemeinde Musterdorf", "forester": null, "serviceProvider": null, "buyer": null, "hiebsNumber": null,
        "lotNumber": "7", "areaNumber": null, "division": null, "subdivision": null, "inventoryUnit": null
      }
    }
  ]
}

Versioning

Enum reference

WoodQuality (link and file)
ValueLabel in the app (DE / EN)Meaning
aA / AQuality class A
bB / BQuality class B
bcB/C / B/CB and C
cC / CQuality class C
bcdB/C/D / B/C/DB, C and D
cdC/D / C/DC and D
dD / DQuality class D
inIN / INIndustrial wood, normal
ifIF / IDIndustrial wood, defective
ikIK / ISIndustrial wood, diseased
Diameter classes (file)
classMid diameter (cm)
0< 10
1a10 – 14
1b115 – 16
1b217 – 19
2a20 – 24
2b25 – 29
3a30 – 34
3b35 – 39
4a40 – 44
4b45 – 49
5a50 – 54
5b55 – 59
6a60 – 64
6b65 – 69
770 – 79
8≥ 80
WoodAssortment (file only)
ValueMeaning
StammholzRound timber
EnergieholzEnergy wood
IndustrieholzIndustrial wood
SondersortimentSpecial assortment
PalettenholzPallet wood
WoodVariety (file only)
ValueMeaning
LangLong
KurzShort
AbschnitteSections
WaldhackschnitzelForest chips
AndereOther

WoodSpecies, full list

All 183 values accepted for species in the link and used in the file. Codes are lowercase (the link also accepts uppercase).

ValueDEEN
xyLaub- & NadelholzHardwood and Softwood
buBucheBeech
seiStieleicheCommon Oak
teiTraubeneicheSessile Oak
reiRoteicheRed Oak
zeiZerreicheTurkey Oak
sueiSumpfeichePin Oak
eiEicheOak
keiKorkeicheCork Oak
steiSteineicheHolm Oak
wseiAmerikanische WeißeicheAmerican White Oak
quesonstige EichenOther Oaks
esEscheAsh
gesGemeine EscheCommon Ash
wesWeißescheWhite Ash
fraSonstige EschenOther Ash
hbuHainbuche / WeißbucheHornbeam
ahAhornMaple
bahBergahornSycamore
sahSpitzahornNorway Maple
fahFeldahornField Maple
eahEschenblättriger AhornAsh-leaved Maple
siahSilberahornSilver Maple
zahZuckerahornSugar Maple
rahRotahornRed Maple
aceSonstige AhorneOther Maples
liLindeLime
wliWinterlindeSmall-leaved Lime
sliSommerlindeLarge-leaved Lime
tilSonstige LindenOther Lime Trees
robRobinieBlack Locust
akzAkazie (Acacia)Acacia
amanAkazie (Acacia mangium)Mangium (Acacia mangium)
ameaSchwarze Akazie (Acacia mearnsii)Black Wattle (Acacia mearnsii)
ulUlmeElm
bulBergulmeWych Elm
fulFeldulmeField Elm
fluFlatterulmeEuropean White Elm
ulmSonstige UlmenOther Elms
rkaRosskastanieHorse Chestnut
ekaEdelkastanieSweet Chestnut
kaKastanieChestnut
mauWeißer MaulbeerbaumWhite Mulberry
nusNussbaumWalnut
wnuWalnussCommon Walnut
snuSchwarznuss und HybridenBlack Walnut and Hybrids
jugSonstige NussbäumeOther Nut Trees
steStechpalmeHolly
plaPlatanePlane
aplAhornblättrige PlataneLondon Plane
solhSonstige Laubbäume mit hoher LebensdauerOther deciduous trees with a long lifespan
gbiGemeine BirkeSilver Birch
mbiMoorbirke / KarpatenbirkeDowny Birch / Carpathian Birch
biBirkeBirch
erlErleAlder
serSchwarzerleBlack Alder
werWeißerle / GrauerleGrey Alder
gerGrünerleGreen Alder
alnSonstige ErlenOther Alders
papPappelPoplar
zpaAspe / ZitterpappelEuropean Aspen
spaEuropäische SchwarzpappelEuropean Black Poplar
spahSchwarzpappel HybridBlack Poplar Hybrid
gpaGraupappel HybridGrey Poplar Hybrid
wpaSilberpappel / WeißpappelSilver Poplar / White Poplar
bpaBalsampappelBalsam Poplar
bpahBalsampappel HybridBalsam Poplar Hybrid
azpaAmerikanische ZitterpappelQuaking Aspen
popSonstige PappelnOther Poplars
sorSorbusartenSorbus Species
ssoSonstige SorbusartenOther Sorbus Species
vbVogelbeereRowan
elsElsbeereWild Service Tree
speSpeierlingService Tree
mebEchte MehlbeereWhitebeam
weiWeideWillow
sweiSalweideGoat Willow
kirKirscheCherry
gtkGew. TraubenkirscheCommon Bird Cherry
vkVogelkirscheWild Cherry
stkSpätbl. TraubenkirscheBlack Cherry
pruSonstige KirschenOther Cherries
zweZwetschgePlum
hicHickoryHickory
solnSonstige Laubbäume mit niedriger LebensdauerOther deciduous trees with a short lifespan
fauGemeiner Faulbaum / PulverholzAlder Buckthorn
wobWildobst (unbestimmt)Wild fruit (unspecified)
wapHolzapfel / WildapfelCrab Apple / Wild Apple
wbiHolzbirne / WildbirneEuropean Wild Pear
hasBaumhaselTurkish Hazel
gotGem. GötterbaumTree of Heaven
eukEukalyptusEucalyptus
egloBlauer EukalyptusBlue Gum (Eucalyptus globulus)
enitEucalyptus nitensShining Gum (Eucalyptus nitens)
egraEucalyptus grandisFlooded Gum (Eucalyptus grandis)
eugrEucalyptus urograndisEucalyptus urograndis
edunEucalyptus dunniiDunn's White Gum (Eucalyptus dunnii)
epilEucalyptus pilularisBlackbutt (Eucalyptus pilularis)
eregRieseneukalyptusMountain Ash (Eucalyptus regnans)
ecamRoter EukalyptusRiver Red Gum (Eucalyptus camaldulensis)
cmacCorymbia maculataSpotted Gum
paulPaulowniePaulownia
teakTeakTeak
kautKautschukbaumRubberwood
tulTulpenbaumTulip Tree (Yellow Poplar)
salSalbaumSal (Shorea robusta)
sajaTerminalia ellipticaIndian Laurel (Terminalia elliptica)
shisSheesham (Dalbergia sissoo)Shisham (Dalbergia sissoo)
mangMangoMango
neemNiembaumNeem
macaMassaranduba (Manilkara)Massaranduba (Manilkara)
jatoJatoba (Hymenaea courbaril)Jatoba (Hymenaea courbaril)
ipeIpé (Handroanthus)Ipe (Handroanthus)
cumaCumaru (Dipteryx)Cumaru (Dipteryx)
meraMeranti (Shorea)Meranti (Shorea)
slbhSonstiges HartlaubholzOther Hard Broadleaves
lbhLaubholzHardwood
slbwSonstiges WeichlaubholzOther Soft Broadleaves
strStrauch (unbestimmt)Shrub (unspecified)
fitaMischsortiment Fichte/TanneMixed Assortment Spruce/Fir
ndhNadelholzSoftwood
fiFichteSpruce
gfiGemeine FichteNorway Spruce
ofiOmorikafichteSerbian Spruce
sfiSitkafichteSitka Spruce
swfiSchwarzfichteBlack Spruce
efiEngelmannsfichteEngelmann Spruce
bfiBlaufichte/StechfichteBlue Spruce
wfiWeißfichteWhite Spruce
jefiAjanfichteYezo Spruce
sofiSonstige FichtenOther Spruce
kieKieferPine
kiGemeine KieferScots Pine
bkiBergkieferMountain Pine
skiSchwarzkieferEuropean Black Pine
rkiRumelische KieferMacedonian Pine
zkiZirbelkieferSwiss Stone Pine
wkiWeymouthskieferWeymouth Pine
mkiMurraykieferLodgepole Pine
gkiGelbkieferPonderosa Pine
rakiMontereykieferRadiata Pine
sekiSeekieferMaritime Pine
takiWeihrauchkieferLoblolly Pine
elkiElliottkieferSlash Pine
alkiAleppokieferAleppo Pine
piniPinieStone Pine
chkiEmodikiefer (Pinus roxburghii)Chir Pine
jrkiJapanische RotkieferJapanese Red Pine
jskiJapanische SchwarzkieferJapanese Black Pine
pakiKiefer (Pinus patula)Patula Pine
makiKiefer (Pinus massoniana)Masson Pine
sokiSonstige KieferOther Pine
taTanneFir
wtaWeißtanneSilver Fir
ataAmerikanische EdeltanneNoble Fir
ctaColoradotanneColorado Fir
ktaKüstentanneGrand Fir
nitaNikkotanneNikko Fir
notaNordmannstanneNordmann Fir
vtaVeitchtanneVeitch's Fir
sataSachalintanneSakhalin Fir
sotaSonstige TannenOther Firs
dglDouglasieDouglas Fir
laLärcheLarch
elaEuropäische LärcheEuropean Larch
jlaJapanische Lärche und HybridenJapanese Larch and Hybrids
slaSonstige LärchenOther Larches
sonbSonstige NadelbäumeOther Conifers
lbLebensbaumArborvitae / Thuja
rlbRiesenlebensbaumWestern Red Cedar
htHemlockstanneHemlock
whtWestamerikanische HemlockstanneWestern Hemlock
mamMammutbaumGiant Sequoia
kmamKüstenmammutbaumCoast Redwood
eibEibeYew
szLawsonszypresseLawson Cypress
sugiSicheltanne (Sugi)Sugi (Japanese Cedar)
hinoHinoki-ScheinzypresseHinoki Cypress
hibaHiba-LebensbaumHiba Arborvitae
deodHimalayazederDeodar Cedar
hoopNeuguinea-AraukarieHoop Pine
mzyMontereyzypresseMonterey Cypress
cunnSpießtanneChinese Fir