Firebase Cloud Function Nutrition Lookup Proxy
Published June 9, 2026
A Firebase Cloud Function nutrition lookup proxy is the fastest path for mobile teams already on Firebase Auth and Firestore. Your Flutter, React Native, or native apps call https://us-central1-PROJECT.cloudfunctions.net/foodSearch while the Calorie API key lives in Firebase secrets.
Why Firebase for Nutrition Lookup
| Benefit | Detail |
|---|---|
| Same stack as mobile auth | Verify ID tokens before lookup |
| Secrets Manager | CALORIE_API_KEY not in repo |
| Global HTTPS endpoints | Callable from iOS and Android |
| Scales with users | Pay per invocation |
Compare with Supabase Edge Functions or Next.js routes.
Step 1: Initialize Functions
firebase init functions
cd functions
npm install firebase-functions firebase-admin
Set secret:
firebase functions:secrets:set CALORIE_API_KEY
Step 2: HTTP Function (Gen 2)
functions/index.js:
const { onRequest } = require('firebase-functions/v2/https');
const { defineSecret } = require('firebase-functions/params');
const calorieApiKey = defineSecret('CALORIE_API_KEY');
const UPSTREAM = 'https://api.calorieapi.com/api/v1';
exports.foodSearch = onRequest(
{ secrets: [calorieApiKey], cors: true },
async (req, res) => {
const q = String(req.query.q ?? '').trim();
const limit = Math.min(parseInt(req.query.limit, 10) || 10, 25);
if (q.length < 2 || q.length > 100) {
return res.status(400).json({ error: 'Invalid query' });
}
const url = `${UPSTREAM}/search/foods?q=${encodeURIComponent(q)}&limit=${limit}`;
const upstream = await fetch(url, {
headers: { 'X-API-Key': calorieApiKey.value() },
});
const data = await upstream.json();
res.status(upstream.status).json(data);
}
);
Step 3: Barcode Lookup Function
exports.foodBarcode = onRequest(
{ secrets: [calorieApiKey], cors: true },
async (req, res) => {
const upc = String(req.query.upc ?? '').trim();
if (!/^\d{8,14}$/.test(upc)) {
return res.status(400).json({ error: 'Invalid barcode' });
}
const url = `${UPSTREAM}/search/barcode/${upc}`;
const upstream = await fetch(url, {
headers: { 'X-API-Key': calorieApiKey.value() },
});
const data = await upstream.json();
res.status(upstream.status).json(data);
}
);
Step 4: Require Firebase Auth (Recommended)
const admin = require('firebase-admin');
admin.initializeApp();
async function verifyAuth(req) {
const header = req.headers.authorization || '';
const token = header.startsWith('Bearer ') ? header.slice(7) : null;
if (!token) throw new Error('Unauthorized');
return admin.auth().verifyIdToken(token);
}
// Call verifyAuth(req) before upstream fetch
Attach Firebase ID token from mobile clients.
Step 5: Client Call (Flutter Example)
final token = await FirebaseAuth.instance.currentUser!.getIdToken();
final uri = Uri.parse('https://us-central1-APP.cloudfunctions.net/foodSearch?q=banana');
final res = await http.get(uri, headers: {'Authorization': 'Bearer $token'});
Step 6: Deploy
firebase deploy --only functions
Cost and Quota Tips
- Cache hot searches in Firestore or Memorystore
- Debounce mobile search input
- Monitor Calorie API dashboard alongside Firebase usage
- Upgrade Calorie API plan before viral launch
Related Guides
Frequently Asked Questions
How do I proxy a nutrition API with Firebase Cloud Functions?
Store CALORIE_API_KEY in Firebase secrets, create HTTPS functions that validate input and forward to Calorie API with X-API-Key, and call those URLs from your mobile app.
Should Firebase functions require authentication?
Yes for production. Verify Firebase ID tokens before forwarding nutrition lookups to prevent anonymous quota abuse.
Firebase or Supabase for nutrition API proxy?
Choose Firebase if your app already uses Firebase Auth and Firestore. Choose Supabase Edge Functions if your backend is Postgres on Supabase.
Can Flutter apps use Firebase Cloud Functions for food search?
Yes. Call the deployed function URL with the user's Firebase ID token and parse the JSON search results.
How do I add barcode lookup on Firebase?
Deploy a second function that validates UPC format and calls Calorie API GET /search/barcode/{upc} server-side.
