Skip to content

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

BenefitDetail
Same stack as mobile authVerify ID tokens before lookup
Secrets ManagerCALORIE_API_KEY not in repo
Global HTTPS endpointsCallable from iOS and Android
Scales with usersPay 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);
  }
);
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

  1. Cache hot searches in Firestore or Memorystore
  2. Debounce mobile search input
  3. Monitor Calorie API dashboard alongside Firebase usage
  4. Upgrade Calorie API plan before viral launch

Get API key | Docs

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.

← Back to all articles

Start building with the Calorie API

Get a free API key and access 4M+ foods with search, barcode lookup, and full macro data.