#517·lago

[BUG]: CORS error when calling Lago API endpoint via JS client

Author: DoNguyenDung93Created Apr 17, 2025Updated Jun 30, 2025
Labelsstale

Describe the bug I'm getting a CORS error when trying to call local lago api endpoint from my localhost js client.

Image

To Reproduce Steps to reproduce the behavior:

  1. Setup a new self-hosted Lago instance
  2. Update .env with:
LAGO_FRONT_URL="http://localhost:41211"
FRONT_PORT=41211
LAGO_API_URL="http://localhost:41212"
API_PORT=41212
  1. Run docker compose.
  2. Create customer, billing metrics, plans, etc.
  3. Setup JS client:
bash
import { LAGO_API_KEY, LAGO_BASE_PATH } from "@constants/index";
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"

import { Client } from 'lago-javascript-client';

const lagoClient = Client(LAGO_API_KEY, { baseUrl: LAGO_BASE_PATH });

export const createLagoEvent = createAsyncThunk<any, any, { rejectValue: string }>(
    'lago/createEvent',
    async (billableMetricCode: string) => {
        try {
            const timeStamp = Date.now();
            const transactionID = transaction_${timeStamp};
            const response = await lagoClient.events.createEvent({
                event: {
                  transaction_id: transactionID,
                  external_subscription_id: "fca28a4c-5bea-4423-a535-94f2a37b5b93",
                  code: billableMetricCode
                },
            });
            console.log(response);
            const result = await response.json();
            return result;
        } catch (error) {
            console.log(error);
            return convertToString(error);
        }
    }
)

function convertToString(obj: any) {
    try {
        return JSON.stringify(obj);
    } catch {
        return String(obj);
    }
}

interface LagoState {
    result: any;
    error: string | null;
    loading: boolean;
}

const initialState: LagoState = {
    result: null,
    error: null,
    loading: false
}

const lagoSlice = createSlice({
    name: 'lago',
    initialState: initialState,
    reducers: {},
    extraReducers: (builder) => {
        builder
        .addCase(createLagoEvent.pending, (state) => {
            state.loading = true;
            state.error = null;
        })
        .addCase(createLagoEvent.fulfilled, (state, action) => {
            state.loading = false;
            state.result = action.payload;
        })
        .addCase(createLagoEvent.rejected, (state, action) => {
            state.loading = false;
            state.error = action.payload ?? "Unknown error";
        })
    }
});

export default lagoSlice.reducer;

Expected behavior I would like to know how to resolve this? Normally CORS errors are resolved with "Access-Control-Allow-Origin" at the server header, but I'm not sure how to configure that for localhost Lago API.