> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usefini.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List provider resources

> Discover importable resources from a connected provider. Step 1 of the provider import flow.

Lists resources that can be imported from a connected provider. This is the first call in the connected-source flow. Once you have picked the resources you want, pass them to [Register provider resources](/en/api-reference/register-provider-resources) to create source records.

<Note>
  Resources that have already been imported successfully from the provider are excluded from the response. This endpoint is for discovering *new* content, not auditing what is already in Fini. To see what is already imported, use [List sources](/en/api-reference/list-sources) with the provider as a `source` filter.
</Note>

## Headers

<ParamField header="Authorization" type="string" required>
  Bearer token containing your Fini workspace API key. Format: `Bearer fini_...`
</ParamField>

## Path parameters

<ParamField path="provider" type="string" required>
  Provider name. Supported values: `notion`, `zendesk`, `confluence`.
</ParamField>

<Warning>
  The provider must already be connected in the workspace via the dashboard. A disconnected or unsupported provider returns `400 Bad Request`.
</Warning>

<RequestExample>
  ```bash cURL theme={null}
  curl --request GET \
    --url 'https://api-prod.usefini.com/v2/documents/public/resources/notion' \
    --header 'Authorization: Bearer fini_your_api_key'
  ```

  ```python Python theme={null}
  import requests

  provider = "notion"
  response = requests.get(
      f"https://api-prod.usefini.com/v2/documents/public/resources/{provider}",
      headers={"Authorization": "Bearer fini_your_api_key"},
  )
  resources = response.json()
  ```

  ```javascript Node.js theme={null}
  const provider = "notion";

  const response = await fetch(
    `https://api-prod.usefini.com/v2/documents/public/resources/${provider}`,
    {
      headers: {
        Authorization: "Bearer fini_your_api_key",
      },
    }
  );
  const resources = await response.json();
  ```
</RequestExample>

## Response

The response shape varies by provider.

### Notion

A flat array of `NotionResource` objects.

<ResponseField name="[]" type="NotionResource[]">
  Array of importable Notion resources.
</ResponseField>

### Zendesk

A nested category tree returned as `ZendeskCategory[]`. Categories contain section `children`, and sections contain article `children`.

<ResponseField name="[]" type="ZendeskCategory[]">
  Root category tree for the connected Zendesk help center.
</ResponseField>

### Confluence

An array of `ConfluenceSpace` objects, each with nested `pages`.

<ResponseField name="[]" type="ConfluenceSpace[]">
  Array of importable Confluence spaces.
</ResponseField>

<ResponseExample>
  ```json Notion theme={null}
  [
    {
      "externalId": "123456",
      "title": "Billing FAQ",
      "originalUrl": "https://www.notion.so/fini/Billing-FAQ-123456",
      "mimeType": "text/markdown",
      "iconLink": null,
      "object": "page"
    },
    {
      "externalId": "789012",
      "title": "Refund Policy",
      "originalUrl": "https://www.notion.so/fini/Refund-Policy-789012",
      "mimeType": "text/markdown",
      "iconLink": "https://www.notion.so/icons/document_gray.svg",
      "object": "page"
    }
  ]
  ```

  ```json Zendesk theme={null}
  [
    {
      "externalId": "200001",
      "title": "Billing",
      "type": "category",
      "children": [
        {
          "externalId": "300001",
          "title": "Payments",
          "type": "section",
          "children": [
            {
              "externalId": "400001",
              "title": "How do I update my card?",
              "originalUrl": "https://example.zendesk.com/hc/en-us/articles/400001",
              "type": "article"
            }
          ]
        }
      ]
    }
  ]
  ```

  ```json Confluence theme={null}
  [
    {
      "key": "SUPPORT",
      "title": "Support Space",
      "originalUrl": "https://example.atlassian.net/wiki/spaces/SUPPORT",
      "pages": [
        {
          "externalId": "98765",
          "title": "Troubleshooting login issues",
          "originalUrl": "https://example.atlassian.net/wiki/spaces/SUPPORT/pages/98765"
        }
      ]
    }
  ]
  ```

  ```json 400 Bad Request theme={null}
  {
    "statusCode": 400,
    "message": "Provider not supported on public route",
    "error": "Bad Request"
  }
  ```
</ResponseExample>

## Nested objects

### NotionResource

<ResponseField name="externalId" type="string">
  Notion page or database ID.
</ResponseField>

<ResponseField name="title" type="string">
  Resource title.
</ResponseField>

<ResponseField name="originalUrl" type="string">
  Notion URL.
</ResponseField>

<ResponseField name="mimeType" type="string">
  MIME type. Typically `text/markdown` for pages.
</ResponseField>

<ResponseField name="iconLink" type="string | null">
  URL to the resource's Notion icon, when set.
</ResponseField>

<ResponseField name="object" type="string">
  Notion object type, for example `page` or `database`.
</ResponseField>

### ZendeskCategory

<ResponseField name="externalId" type="string">
  Zendesk category ID.
</ResponseField>

<ResponseField name="title" type="string">
  Category title.
</ResponseField>

<ResponseField name="type" type="string">
  Always `category`.
</ResponseField>

<ResponseField name="children" type="ZendeskSection[]">
  Nested sections inside the category.
</ResponseField>

### ZendeskSection

<ResponseField name="externalId" type="string">
  Zendesk section ID.
</ResponseField>

<ResponseField name="title" type="string">
  Section title.
</ResponseField>

<ResponseField name="type" type="string">
  Always `section`.
</ResponseField>

<ResponseField name="children" type="ZendeskArticle[]">
  Nested articles inside the section.
</ResponseField>

### ZendeskArticle

<ResponseField name="externalId" type="string">
  Zendesk article ID.
</ResponseField>

<ResponseField name="title" type="string">
  Article title.
</ResponseField>

<ResponseField name="originalUrl" type="string">
  Zendesk article URL.
</ResponseField>

<ResponseField name="type" type="string">
  Always `article`.
</ResponseField>

### ConfluenceSpace

<ResponseField name="key" type="string">
  Confluence space key.
</ResponseField>

<ResponseField name="title" type="string">
  Space title.
</ResponseField>

<ResponseField name="originalUrl" type="string">
  Space URL.
</ResponseField>

<ResponseField name="pages" type="ConfluencePage[]">
  Pages discovered inside the space.
</ResponseField>

### ConfluencePage

<ResponseField name="externalId" type="string">
  Confluence page ID.
</ResponseField>

<ResponseField name="title" type="string">
  Page title.
</ResponseField>

<ResponseField name="originalUrl" type="string">
  Page URL.
</ResponseField>

## Next step

Once you've picked the resources to import, pass them to [Register provider resources](/en/api-reference/register-provider-resources) to create source records. Resource registration alone does **not** queue ingestion. You still need to call [Ingest sources](/en/api-reference/ingest-sources) after.

## Errors

<AccordionGroup>
  <Accordion title="400 Bad Request" icon="circle-exclamation">
    The provider is not supported on the public route (only `notion`, `zendesk`, `confluence` are accepted), or it's not connected in the workspace yet. Connect the provider in the dashboard first.
  </Accordion>

  <Accordion title="401 Unauthorized" icon="lock">
    The API key is missing, malformed, revoked, or invalid. Confirm `Authorization: Bearer fini_...` with the full key.
  </Accordion>

  <Accordion title="403 Forbidden" icon="shield-halved">
    The API key doesn't include the `read` scope, or the provider connection belongs to a different workspace.
  </Accordion>

  <Accordion title="The response is empty" icon="circle-question">
    Either the provider has no content to import, or everything available has already been imported. Already-imported resources are filtered out. Check [List sources](/en/api-reference/list-sources) with `source` set to the provider to see what is already in Fini.
  </Accordion>
</AccordionGroup>
