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

# Bulk upload employees (v2)

> Upload a CSV file to onboard multiple employees at once. Identical to POST /v1/employees/bulk-upload, with one difference: this endpoint automatically triggers MVR (Member Verification) for every successfully-created row that...

Maximum 500 rows per upload, 200 KB file size — split larger files into batches.

Rows that pass all validation are saved and get MVR auto-triggered. Rows with missing or invalid fields are returned in `partialRecords` (no MVR is attempted for these until they're completed). Duplicate records are returned in `failedRecords`.

### Responses

| Code | Description |
| - | - |
| `200` | Upload summary |
| `400` | No file uploaded or file is not valid CSV |
| `401` | Unauthorized |

### Response fields

**bulkUploadId** `string`

ID of the bulk upload session record

**uploaded** `integer`

Number of employees successfully uploaded (MVR auto-triggered for those with a fund identity)

**partial** `integer`

Number of rows saved as partial (missing required fields) — no MVR attempted yet

**failed** `integer`

Number of rows that failed outright (duplicate, or missing email)

**uploadedRecords** `array`

Successfully created employee records, each including the current mvrStatus/mvrStatusReason — see the Create Employee response above for the full shape.

**partialRecords** `array`

Rows saved as partial employees pending self-completion via magic link

**failedRecords** `array`

Details of outright-failed rows (duplicate, or missing email)

```bash cURL theme={null}
curl 'https://qa-super.mygigsters.com.au/v2/employees/bulk-upload' -X POST \
    -u "apiUsername:apiPassword"
```

```javascript Node.js theme={null}
const response = await fetch("https://qa-super.mygigsters.com.au/v2/employees/bulk-upload", {
  method: "POST",
  headers: {
    Authorization: "Basic " + Buffer.from("apiUsername:apiPassword").toString("base64"),
  },
});

const data = await response.json();
console.log(data);
```

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

response = requests.post(
    "https://qa-super.mygigsters.com.au/v2/employees/bulk-upload",
    auth=("apiUsername", "apiPassword"),
)

print(response.json())
```

```ruby Ruby theme={null}
require "net/http"
require "json"
require "uri"

uri = URI("https://qa-super.mygigsters.com.au/v2/employees/bulk-upload")
request = Net::HTTP::Post.new(uri)
request.basic_auth("apiUsername", "apiPassword")

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

puts JSON.parse(response.body)
```

```php PHP theme={null}
<?php

$ch = curl_init("https://qa-super.mygigsters.com.au/v2/employees/bulk-upload");

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_USERPWD => "apiUsername:apiPassword",
]);

$response = curl_exec($ch);
curl_close($ch);

print_r(json_decode($response, true));
```

```java Java theme={null}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Base64;

public class Example {
    public static void main(String[] args) throws Exception {
        String credentials = Base64.getEncoder()
            .encodeToString("apiUsername:apiPassword".getBytes());

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://qa-super.mygigsters.com.au/v2/employees/bulk-upload"))
            .header("Authorization", "Basic " + credentials)
            .method("POST", HttpRequest.BodyPublishers.noBody())
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.body());
    }
}
```

```go Go theme={null}
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, err := http.NewRequest("POST", "https://qa-super.mygigsters.com.au/v2/employees/bulk-upload", nil)
	if err != nil {
		panic(err)
	}
	req.SetBasicAuth("apiUsername", "apiPassword")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	data, _ := io.ReadAll(res.Body)
	fmt.Println(string(data))
}
```

```csharp .NET theme={null}
using System.Net.Http.Headers;
using System.Text;

using var client = new HttpClient();

var request = new HttpRequestMessage(HttpMethod.Post, "https://qa-super.mygigsters.com.au/v2/employees/bulk-upload");
request.Headers.Authorization = new AuthenticationHeaderValue(
    "Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes("apiUsername:apiPassword")));

var response = await client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());
```

```json 200 theme={null}
{
  "bulkUploadId": "507f1f77bcf86cd799439011",
  "uploaded": 2,
  "partial": 1,
  "failed": 0,
  "uploadedRecords": [
    {
      "employeeId": "6953884140b85eeded2bf2ea",
      "email": "lisa.brown@email.com",
      "mvrStatus": "PENDING",
      "mvrStatusReason": null
    },
    {
      "employeeId": "6953884140b85eeded2bf2eb",
      "email": "sam.jones@email.com",
      "mvrStatus": "NOT_APPLICABLE",
      "mvrStatusReason": "No fund identity set at time of check"
    }
  ],
  "partialRecords": [
    {
      "row": 3,
      "partialEmployeeId": "6953884140b85eeded2bf2ec",
      "email": "alice@example.com",
      "firstName": "Alice",
      "lastName": "Smith",
      "missingFields": [
        "usi"
      ]
    }
  ],
  "failedRecords": []
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.