Agile API /board/750/epic returning empty array

Description:
The Jira Agile API endpoint /rest/agile/1.0/board/750/epic is returning an empty array (values: []) for board ID 750.

Steps to Reproduce:

  1. Call GET https://laks-1985.atlassian.net/rest/agile/1.0/board/750/epic from the frontend app.

  2. Include proper authentication (Bearer token or session).

  3. Observe the response.

Expected Behavior:
The API should return all epics associated with board 750 (worked correctly 7 days ago).

Actual Behavior:
Response returns:

{
  "maxResults": 50,
  "startAt": 0,
  "isLast": true,
  "values": []
}

Additional Notes:

  • Only frontend calls were used 7 days ago, and the API returned the full epic list.

  • No recent changes in the board configuration.

  • Board type: simple, Project key: EDUCATIONA.

Hello @LakshmiNarayananND

Although you have provided a very detailed description of the problem, nobody here has access to your specific Jira Software Cloud instance at https://laks-1985.atlassian.net, so no-one here can access that specific Board with that ID to validate what you have described.

In my personal experience, when queries to the Board APIs didn’t return the results I expected, the cause of the problem was always just a Jira configuration problem, nothing else. Either the Board wasn’t configured to allow that user to access it, the Board filter wasn’t correctly configured to display a specific Issue type, or the user didn’t have the correct permission to view that Issue type from its source Project.

I suggest you login to Jira’s GUI using a web browser using the same user’s credentials (the “Bearer token or session” you said you were using) as used in your REST API call, then visually inspect that Project Board and confirm for yourself if it does display those Epics to that user. You can also cross-check that by just opening a new tab in the same browser session and entering the URL https://laks-1985.atlassian.net/rest/agile/1.0/board/{boardId}/epic which will make an authenticated request, as that user, to that endpoint, and the response will match what you see in the GUI.

Hello sunnyape

Thank you for your response. I’d like to provide additional context to clarify the issue.


Summary of the Issue

  • App Type: Atlassian Forge frontend app (iframe)

  • Board / Project: EDUCATIONA project, Board ID 752 (also tested 751)

  • Endpoint: GET /rest/agile/1.0/board/{boardId}/epic

  • Observed Behavior:

    • Inside Forge iframe: Returns an empty values: [] array

    • In browser (authenticated): https://laks-1985.atlassian.net/rest/agile/1.0/board/752/epic returns full epic list as expected

    • Status: 200, no errors

  • Timeline: This functionality worked 7 days ago, stopped after recent deploys / manifest changes


Steps / Verification Done

  1. Using the Forge iframe, the following code is called:
export const fetchEpicLinkField = async (
  boardId: string | number
): Promise<Array<{ epicName: string; epicKey: string }>> => {
  if (!boardId) {
    console.error('❌ No boardId provided.');
    return [];
  }

  try {
    console.log('➡️ Fetching epics for boardId:', boardId);

    const response = await requestJira(`/rest/agile/1.0/board/${boardId}/epic`, {
      headers: { Accept: 'application/json' }
    });

    console.log('⏳ Response status:', response.status);

    if (!response.ok) {
      console.error('❌ Fetch failed with status:', response.status);
      return [];
    }

    const res = await response.json();
    console.log('📄 Raw response body:', res);

    if (res?.values && Array.isArray(res.values) && res.values.length > 0) {
      const epicNames = res.values.map((value: any) => ({
        epicName: value.summary,
        epicKey: value.key
      }));
      console.log('✅ Epics fetched successfully:', epicNames);
      return epicNames;
    }

    console.warn('⚠️ Agile API returned empty epics array for boardId:', boardId);
    return [];
  } catch (error) {
    console.error('❌ Error fetching Board and epic List:', error);
    return [];
  }
};

  1. Console logs from the Forge iframe show:
Boards: [{id: 752, name: 'EDUCATIONA board', type: 'simple'}]
Fetching epics for boardId: 752
Response status: 200
Raw response body: { values: [] }

  1. Browser verification: Accessing the endpoint directly in browser:
    https://laks-1985.atlassian.net/rest/agile/1.0/board/752/epic

Response:

{
  "maxResults":50,
  "startAt":0,
  "isLast":true,
  "values":[
    {"id":14800,"key":"EDUCATIONA-1","summary":"AI Infrastructure Setup"},
    {"id":14801,"key":"EDUCATIONA-2","summary":"AI Data Pipeline & Labeling"},
    {"id":14802,"key":"EDUCATIONA-3","summary":"AI Build"},
    {"id":14803,"key":"EDUCATIONA-4","summary":"AI Validation & Testing"},
    {"id":14804,"key":"EDUCATIONA-5","summary":"AI Deployment"},
    {"id":14805,"key":"EDUCATIONA-6","summary":"AI Monitoring"},
    {"id":14806,"key":"EDUCATIONA-7","summary":"AI Enterprise Governance"}
  ]
}


Key Observations

  1. Frontend-only issue: Backend is not involved. The FE iframe fetch returns empty, while direct browser access succeeds.

  2. Scope / Permissions: Manifest includes:

- read:epic:jira-software
- write:epic:jira-software
- read:board-scope:jira-software

  1. Manifest and CSP: Properly configured, including https://laks-1985.atlassian.net/.

  2. Timeline: Worked 7 days ago; no changes to board or epics occurred on Jira side.


Questions / Assistance Needed

  1. Why is the Agile API returning empty epics only when called from a Forge iframe?

  2. Did anything change recently in Forge / Jira Cloud that could impact iframe FE fetches?

  3. Are additional manifest permissions or configuration changes required to restore iframe access to board epics?


Conclusion

This appears to be a Forge app iframe-specific issue, unrelated to the REST API itself or user permissions. The same endpoint works correctly in the browser (https://laks-1985.atlassian.net/rest/agile/1.0/board/752/epic) using the same user credentials.

We’d greatly appreciate guidance on why the iframe FE context fetch stopped returning epics and what changes are needed to resolve this.