Developers v1 Preview

The FindFlower API.

The same identification engine that powers FindFlower, available for your own projects. Bring a photo, get a species, a confidence score, and verified context — through an on-device SDK you can use today, or a hosted REST API in preview.

Available now

On-device SDK

Load the model directly in your web or Node application with TensorFlow.js. Inference runs on your users’ devices — no server, no API key, no per-request cost.

Jump to the SDK
Preview

Hosted REST API

A stateless HTTPS API for server-side and cross-platform use. Documented below and stabilising during preview — sign in to reserve a key and receive launch access.

View the endpoints

Authentication

The hosted API authenticates with a bearer key sent in the Authorization header. Keys are tied to your developer account — sign in to generate yours. The on-device SDK needs no key.

Your API key Sign in required

Sign in to generate a preview API key and reserve access for launch.

Sign in to continue

Base URL & format

All hosted endpoints are versioned and served over HTTPS. Requests and responses are JSON, except image uploads which use multipart/form-data.

https://api.findflower.ibhx.dev/v1
# Every hosted request carries your key Authorization: Bearer ff_preview_your_key_here Accept: application/json

The base host is a placeholder during preview. The request and response shapes below are stable and match the on-device SDK output.

POST /v1/identify

Identify by image upload

Submit a photo file and receive the ranked species predictions. This is the primary endpoint for gallery uploads and drag-and-drop.

Request · multipart/form-data

# field name: image (JPG, PNG or WEBP, up to 10 MB) curl -X POST https://api.findflower.ibhx.dev/v1/identify \ -H "Authorization: Bearer ff_preview_your_key_here" \ -F "image=@sunflower.jpg"

Response · 200 OK

{ "top": { "name": "sunflowers", "confidence": 0.984 }, "predictions": [ { "name": "sunflowers", "confidence": 0.984 }, { "name": "black-eyed susan", "confidence": 0.009 }, { "name": "gazania", "confidence": 0.004 } ], "model_version": "beta-0.9.4" }

Example use case

A nature journaling app lets users attach a photo to an entry; on save, it calls this endpoint and stores the top species and confidence alongside the note.

POST /v1/identify base64 variant

Identify by camera-captured image

Camera frames captured in the browser are most easily sent as a base64 data URL. The same endpoint accepts a JSON body with an image string, so you don’t need to build a multipart request from a canvas.

Request · application/json

// capture a frame, then POST it as a data URL const dataUrl = canvas.toDataURL("image/jpeg", 0.92); await fetch("https://api.findflower.ibhx.dev/v1/identify", { method: "POST", headers: { "Authorization": "Bearer ff_preview_your_key_here", "Content-Type": "application/json" }, body: JSON.stringify({ image: dataUrl }) });

Response · 200 OK

{ "top": { "name": "rose", "confidence": 0.712 }, "predictions": [ /* ...ranked list... */ ], "model_version": "beta-0.9.4" }

Example use case

A field-guide kiosk uses a live camera; each capture is sent as a data URL and the identification is shown on screen without ever writing a file to disk.

POST /v1/identify/url

Identify by URL

Pass a link to an image, or a YouTube URL. The service resolves a still frame (for YouTube, the thumbnail) server-side, which side-steps the browser’s cross-origin limits.

Request · application/json

curl -X POST https://api.findflower.ibhx.dev/v1/identify/url \ -H "Authorization: Bearer ff_preview_your_key_here" \ -H "Content-Type: application/json" \ -d '{ "url": "https://example.com/tulip.jpg" }'

Response · 200 OK

{ "source": "https://example.com/tulip.jpg", "top": { "name": "tulips", "confidence": 0.883 }, "predictions": [ /* ...ranked list... */ ], "model_version": "beta-0.9.4" }

Example use case

A content tool lets editors paste a stock-photo or video link and automatically tags the botanical subject for their media library.

POST /v1/feedback

Feedback submission

Report whether a prediction was correct, and optionally the true species. These signals feed directly into future model versions.

Request · application/json

{ "predicted": "rose", "confidence": 0.712, "correct": false, "correction": "peruvian lily" }

Response · 202 Accepted

{ "received": true, "id": "fb_8f21c4" }

Example use case

After showing a result, your app offers a “Was this right?” prompt; the answer is posted here so your integration contributes to model quality over time.

GET /v1/wikipedia

Wikipedia info retrieval

A convenience endpoint that returns a concise, verified summary and reference image for a species name — the same context shown in the FindFlower workspace.

Request

curl https://api.findflower.ibhx.dev/v1/wikipedia?name=sunflower \ -H "Authorization: Bearer ff_preview_your_key_here"

Response · 200 OK

{ "title": "Common sunflower", "extract": "The common sunflower (Helianthus annuus) is...", "thumbnail": "https://upload.wikimedia.org/.../sunflower.jpg", "url": "https://en.wikipedia.org/wiki/Common_sunflower" }

Example use case

After identification, an app enriches the result card with a short description and image without integrating a separate encyclopedia source.

Available now

On-device SDK

Run identification entirely in your own app with TensorFlow.js. This path is live today — it uses the exact model that powers FindFlower and requires no key. Point the loader at the hosted model files, then preprocess to 224×224.

Install

npm install @tensorflow/tfjs

Identify an image

import * as tf from "@tensorflow/tfjs"; // 1 · load the model and class labels (host these alongside your app) const model = await tf.loadLayersModel("https://findflower.ibhx.dev/model/model.json"); const classes = await (await fetch("https://findflower.ibhx.dev/model/class_names.json")).json(); // 2 · preprocess to 224×224; the model rescales [0,1] → [-1,1] internally function identify(imgEl) { const input = tf.tidy(() => tf.browser.fromPixels(imgEl) .resizeBilinear([224, 224]) .toFloat().div(255).expandDims(0) ); const probs = model.predict(input).dataSync(); input.dispose(); return [...probs] .map((p, i) => ({ name: classes[i], confidence: p })) .sort((a, b) => b.confidence - a.confidence) .slice(0, 5); }

The current Beta model recognises 107 botanical classes. Predictions are a best guess — always surface the confidence score and the runners-up so your users can judge for themselves.

Building with FindFlower?

Reserve hosted-API access, request additional classes, or tell us what you’re building. We read every message.