> ## 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_...` The key needs `read` scope.
</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>
## Related topics
- [Register provider resources](/en/api-reference/register-provider-resources.md)
- [Overview](/en/api-reference/sources.md)
- [Ingest sources](/en/api-reference/ingest-sources.md)
This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.
Sources

