# Overview

Welcome to the Flo User API. This guide will explain how customers can upload matter data directly into our system. This will allow customers to export data from their accounting system of choice and upload it into our Performance Review product.

This endpoint accepts CSV files via multipart/form-data uploads.

### Authentication

All endpoints require authentication.

**Possible authentication errors**

* `401 Unauthorized`
* `403 Forbidden`

***

### Common Requirements

* Requests must use `multipart/form-data`
* CSV files must be uploaded using a `file` form field
* Validation errors are returned in structured JSON responses

***

### Endpoint: Upload Matters via CSV

#### `POST /matters-csv/upload-csv`

Upload matters for a specific review cycle.

#### Query Parameters

| Name          | Type          | Required | Description             |
| ------------- | ------------- | -------- | ----------------------- |
| reviewCycleId | string (UUID) | Yes      | Review cycle identifier |

#### Request

**Headers**

```
Accept: application/json
Content-Type: multipart/form-data
```

**Form Fields**

| Field | Type         | Required |
| ----- | ------------ | -------- |
| file  | binary (CSV) | Yes      |

#### Example (cURL)

```bash
curl -X POST \
  'https://florecruit.com/api/v2/performance/matters-csv/upload-csv?reviewCycleId=YOUR_REVIEW_CYCLE_UUID' \
  -H 'Accept: application/json' \
  -F 'file=@./matters.csv'
```

#### Responses

| Status | Description            | Body   |
| ------ | ---------------------- | ------ |
| 200    | Upload successful      | Empty  |
| 400    | Bad request            | string |
| 404    | Review cycle not found | string |
| 500    | Server error           | string |

***

### Error Schemas

#### `FileError`

Describes errors that apply to the entire CSV file.

| Field   | Type   | Description                  |
| ------- | ------ | ---------------------------- |
| message | string | Human-readable error message |
| type    | string | Error category               |

**Possible `type` values**

* `EMPTY_FILE`
* `INVALID_FILE_FORMAT`
* `MISSING_REQUIRED_COLUMNS`
* `UNEXPECTED_COLUMNS`
* `FILE_SIZE_EXCEEDED`

***

#### `RowColumnError`

Describes validation errors at the row and column level.

| Field      | Type    | Description               |
| ---------- | ------- | ------------------------- |
| rowNumber  | integer | Row number in CSV         |
| columnName | string  | Column with invalid value |
| message    | string  | Error explanation         |
| type       | string  | Validation error type     |
| value      | string  | Offending value           |

**Possible `type` values**

* `EMPTY_REQUIRED_VALUE`
* `INVALID_EMAIL`
* `INVALID_FORMAT`
* `INVALID_URL`
* `INVALID_YEAR`
* `INVALID_DATE_FORMAT`
* `DUPLICATE_VALUE`
* `EXISTING_USER_CONFLICT`
* `INVALID_LIST_SELECTION`
* `INVALID_SSO_ID`
* `ROW_VALUE_CONFLICT`
* `UNKNOWN`

***

### Notes & Best Practices

* Ensure CSV headers match expected column names exactly
* Validation stops at the row level but returns all detected errors
* Successful requests return no payload. Absence of errors means success

### Example CSV Upload

{% file src="/files/dlNczY4BkzjPDSKWUWBm" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.joinflo.com/flo-apis/matter-api/overview.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
