---
title: File Tree API
description: Browse repository file trees and retrieve path information
icon: file-tree
---

# File Tree API

Browse repository file trees and retrieve detailed information about specific paths within repositories.

## Endpoints

### List Repository Tree

Get a flat list of files and folders in a repository.

**Endpoint:** `GET /{repo_type}s/{namespace}/{name}/tree/{revision}/{path}`

**Parameters:**

| Parameter | Type | Location | Required | Description |
|-----------|------|----------|----------|-------------|
| `repo_type` | string | path | Yes | Repository type: `model`, `dataset`, or `space` |
| `namespace` | string | path | Yes | Repository namespace (username or organization) |
| `name` | string | path | Yes | Repository name |
| `revision` | string | path | No | Branch name or commit hash (default: `main`) |
| `path` | string | path | No | Path within repository (default: root `/`) |
| `recursive` | boolean | query | No | List files recursively (default: `false`) |
| `expand` | boolean | query | No | Include detailed metadata (default: `false`) |
| `fallback` | boolean | query | No | Enable fallback to external sources (default: `true`) |

**Authentication:** Optional (required for private repositories)

**Response:**

Returns a flat list of file and folder objects in HuggingFace-compatible format.

**File Object:**
```json
{
  "type": "file",
  "path": "config.json",
  "size": 1234,
  "oid": "abc123...",
  "lastModified": "2025-01-15T10:30:00.000Z",
  "lfs": {
    "oid": "sha256:def456...",
    "size": 1234,
    "pointerSize": 134
  }
}
```

**Directory Object:**
```json
{
  "type": "directory",
  "path": "models",
  "size": 5678900,
  "oid": "tree789...",
  "lastModified": "2025-01-15T10:30:00.000Z"
}
```

**Field Descriptions:**

- `type`: Object type (`file` or `directory`)
- `path`: Relative path from the specified prefix
- `size`: File size in bytes (for directories, sum of all contents)
- `oid`: Object identifier (SHA256 for LFS files, SHA1 for regular files, tree hash for directories)
- `lastModified`: ISO 8601 timestamp of last modification
- `lfs`: LFS metadata (only present for LFS files)
  - `oid`: SHA256 hash of file content
  - `size`: Original file size
  - `pointerSize`: Size of LFS pointer (typically 134 bytes)

**Example Request:**

```python
import requests

# List root directory
response = requests.get(
    "http://localhost:28080/models/myorg/mymodel/tree/main",
    headers={"Authorization": "Bearer YOUR_TOKEN"}
)
files = response.json()

# List specific folder recursively
response = requests.get(
    "http://localhost:28080/models/myorg/mymodel/tree/main/configs",
    params={"recursive": True}
)
files = response.json()
```

**Example Response:**

```json
[
  {
    "type": "file",
    "path": "README.md",
    "size": 2048,
    "oid": "a1b2c3d4...",
    "lastModified": "2025-01-15T10:30:00.000Z"
  },
  {
    "type": "file",
    "path": "model.safetensors",
    "size": 5368709120,
    "oid": "sha256:e5f6g7h8...",
    "lastModified": "2025-01-15T10:30:00.000Z",
    "lfs": {
      "oid": "sha256:e5f6g7h8...",
      "size": 5368709120,
      "pointerSize": 134
    }
  },
  {
    "type": "directory",
    "path": "configs",
    "size": 10240,
    "oid": "tree123...",
    "lastModified": "2025-01-15T10:30:00.000Z"
  }
]
```

**Error Responses:**

| Status | Description |
|--------|-------------|
| 404 | Repository not found or revision not found |
| 403 | Private repository requires authentication |
| 500 | Internal server error |

---

### Get Paths Information

Get detailed information about specific paths in a repository.

**Endpoint:** `POST /{repo_type}s/{namespace}/{name}/paths-info/{revision}`

**Parameters:**

| Parameter | Type | Location | Required | Description |
|-----------|------|----------|----------|-------------|
| `repo_type` | string | path | Yes | Repository type: `model`, `dataset`, or `space` |
| `namespace` | string | path | Yes | Repository namespace (username or organization) |
| `name` | string | path | Yes | Repository name |
| `revision` | string | path | Yes | Branch name or commit hash |

**Request Body (Form Data):**

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `paths` | array[string] | Yes | List of paths to query |
| `expand` | boolean | No | Include extended metadata (default: `false`) |
| `fallback` | boolean | No | Enable fallback to external sources (default: `true`) |

**Authentication:** Optional (required for private repositories)

**Response:**

Returns a list of path information objects. Paths that don't exist are omitted from the response.

**File Info:**
```json
{
  "type": "file",
  "path": "config.json",
  "size": 1234,
  "oid": "abc123...",
  "lfs": {
    "oid": "sha256:def456...",
    "size": 1234,
    "pointerSize": 134
  },
  "last_commit": null,
  "security": null
}
```

**Directory Info:**
```json
{
  "type": "directory",
  "path": "models",
  "oid": "tree789...",
  "tree_id": "tree789...",
  "last_commit": null
}
```

**Example Request:**

```python
import requests

# Query multiple paths
response = requests.post(
    "http://localhost:28080/models/myorg/mymodel/paths-info/main",
    data={
        "paths": ["README.md", "config.json", "models/"],
        "expand": False
    },
    headers={"Authorization": "Bearer YOUR_TOKEN"}
)
paths_info = response.json()
```

**Example Response:**

```json
[
  {
    "type": "file",
    "path": "README.md",
    "size": 2048,
    "oid": "a1b2c3d4...",
    "lfs": null,
    "last_commit": null,
    "security": null
  },
  {
    "type": "file",
    "path": "config.json",
    "size": 512,
    "oid": "b2c3d4e5...",
    "lfs": null,
    "last_commit": null,
    "security": null
  },
  {
    "type": "directory",
    "path": "models",
    "oid": "tree456...",
    "tree_id": "tree456...",
    "last_commit": null
  }
]
```

**Notes:**

- Paths that don't exist are silently omitted from the response
- For directories, include trailing slash (`models/`) or omit it (`models`) - both work
- The `lfs` field is `null` for non-LFS files
- `last_commit` and `security` fields are reserved for future use

**Error Responses:**

| Status | Description |
|--------|-------------|
| 404 | Repository not found |
| 403 | Private repository requires authentication |
| 422 | Invalid request body |
| 500 | Internal server error |

---

## LFS Detection

Files are automatically marked as LFS based on repository-specific settings:

1. **Size threshold**: Files exceeding the threshold use LFS
2. **Suffix rules**: Files with specific extensions (e.g., `.safetensors`, `.bin`) always use LFS
3. **Server defaults**: 32 default suffix rules for ML models, archives, and media files

See the [Repository Settings API](./settings.md) for managing LFS configuration.

---

## Usage Examples

### Python with `requests`

```python
import requests

BASE_URL = "http://localhost:28080"
TOKEN = "YOUR_TOKEN"

headers = {"Authorization": f"Bearer {TOKEN}"}

# List all files in repository
response = requests.get(
    f"{BASE_URL}/models/myorg/mymodel/tree/main",
    headers=headers
)
all_files = response.json()

# List files in specific folder
response = requests.get(
    f"{BASE_URL}/models/myorg/mymodel/tree/main/configs",
    headers=headers
)
config_files = response.json()

# Recursive listing
response = requests.get(
    f"{BASE_URL}/models/myorg/mymodel/tree/main",
    params={"recursive": True},
    headers=headers
)
all_files_recursive = response.json()

# Check specific paths
response = requests.post(
    f"{BASE_URL}/models/myorg/mymodel/paths-info/main",
    data={"paths": ["README.md", "model.safetensors"]},
    headers=headers
)
paths = response.json()

# Filter for LFS files only
lfs_files = [f for f in all_files if f.get("lfs") is not None]
print(f"Found {len(lfs_files)} LFS files")
```

### Python with `huggingface_hub`

```python
from huggingface_hub import HfApi

api = HfApi(endpoint="http://localhost:28080", token="YOUR_TOKEN")

# List files (uses tree endpoint internally)
files = api.list_repo_files(
    repo_id="myorg/mymodel",
    repo_type="model",
    revision="main"
)

# Get file info
file_info = api.repo_info(
    repo_id="myorg/mymodel",
    repo_type="model",
    files_metadata=True
)
```

### JavaScript/TypeScript

```javascript
const BASE_URL = "http://localhost:28080";
const TOKEN = "YOUR_TOKEN";

// List repository tree
async function listFiles(repoId, path = "", recursive = false) {
  const response = await fetch(
    `${BASE_URL}/models/${repoId}/tree/main/${path}?recursive=${recursive}`,
    {
      headers: { Authorization: `Bearer ${TOKEN}` }
    }
  );
  return await response.json();
}

// Get specific paths info
async function getPathsInfo(repoId, paths) {
  const formData = new FormData();
  paths.forEach(path => formData.append("paths", path));

  const response = await fetch(
    `${BASE_URL}/models/${repoId}/paths-info/main`,
    {
      method: "POST",
      headers: { Authorization: `Bearer ${TOKEN}` },
      body: formData
    }
  );
  return await response.json();
}

// Usage
const files = await listFiles("myorg/mymodel");
const pathsInfo = await getPathsInfo("myorg/mymodel", [
  "README.md",
  "config.json"
]);
```

---

## Next Steps

- [Repository Info API](../API.md#repository-info) - Get repository metadata
- [File Operations API](../API.md#file-operations) - Upload and download files
- [Repository Settings API](./settings.md) - Configure LFS thresholds and rules
- [Commits API](../API.md#commits) - View commit history
