# Manage multiple contacts in a list

The `/contactslist/{list_ID}/managemanycontacts` resource allows you to add, remove or unsubscribe multiple contacts to / from a list. This resource is asynchronous and will return a `JobID`, which you can use to monitor the process.

If you are specifying Properties for a contact, please note that these properties must already be defined using the `/contactmetadata` resource. To delete the custom contact data for a specific contact, set the value of the contact property to null.

If a contact has already been added to your contacts or a list, duplicate entries or subscriptions will NOT be created. However, the `Properties` and `Name` of the contact will be updated with any modified values.

### Example

cURL
```shell
curl -s \
	-X POST \
	--user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
	https://api.mailjet.com/v3/REST/contactslist/$list_ID/managemanycontacts \
	-H 'Content-Type: application/json' \
	-d '{
      "Action":"addnoforce",
      "Contacts":[
        {
          "Email":"passenger@mailjet.com",
          "IsExcludedFromCampaigns":"false",
          "Name":"Passenger 1",
          "Properties":"object"
        }
      ]
	}'
```

PHP
```php
<?php
require 'vendor/autoload.php';
use \Mailjet\Resources;
$mj = new \Mailjet\Client(getenv('MJ_APIKEY_PUBLIC'), getenv('MJ_APIKEY_PRIVATE'),true,['version' => 'v3']);
$body = [
  'Action' => "addnoforce",
  'Contacts' => [
    [
      'Email' => "passenger@mailjet.com",
      'IsExcludedFromCampaigns' => "false",
      'Name' => "Passenger 1",
      'Properties' => "object"
    ]
  ]
];
$response = $mj->post(Resources::$ContactslistManagemanycontacts, ['id' => $id, 'body' => $body]);
$response->success() && var_dump($response->getData());
?>
```

Node.js
```javascript
const mailjet = require ('node-mailjet')
	.connect(process.env.MJ_APIKEY_PUBLIC, process.env.MJ_APIKEY_PRIVATE)
const request = mailjet
	.post("contactslist", {'version': 'v3'})
	.id($list_ID)
	.action("managemanycontacts")
	.request({
      "Action":"addnoforce",
      "Contacts":[
        {
          "Email":"passenger@mailjet.com",
          "IsExcludedFromCampaigns":"false",
          "Name":"Passenger 1",
          "Properties":"object"
        }
      ]
    })
request
	.then((result) => {
		console.log(result.body)
	})
	.catch((err) => {
		console.log(err.statusCode)
	})
```

Ruby
```ruby
require 'mailjet'
Mailjet.configure do |config|
  config.api_key = ENV['MJ_APIKEY_PUBLIC']
  config.secret_key = ENV['MJ_APIKEY_PRIVATE']
  config.api_version = "v3"
end
variable = Mailjet::Contactslist_managemanycontacts.create(id: $list_ID,
  action: "addnoforce",
  contacts: [
    {
      'email' => "passenger@mailjet.com",
      'is_excluded_from_campaigns' => "false",
      'name' => "Passenger 1",
      'properties' => "object"
    }
  ]
)
p variable.attributes['Data']
```

Python
```python
from mailjet_rest import Client
import os
api_key = os.environ['MJ_APIKEY_PUBLIC']
api_secret = os.environ['MJ_APIKEY_PRIVATE']
mailjet = Client(auth=(api_key, api_secret), version='v3')
id = '$list_ID'
data = {
  'Action': "addnoforce",
  'Contacts': [
    {
      "Email": "passenger@mailjet.com",
      "IsExcludedFromCampaigns": "false",
      "Name": "Passenger 1",
      "Properties": "object"
    }
  ]
}
result = mailjet.contactslist_managemanycontacts.create(id=id, data=data)
print result.status_code
print result.json()
```

Java
```java
package com.my.project;
import com.mailjet.client.errors.MailjetException;
import com.mailjet.client.errors.MailjetSocketTimeoutException;
import com.mailjet.client.MailjetClient;
import com.mailjet.client.MailjetRequest;
import com.mailjet.client.MailjetResponse;
import com.mailjet.client.ClientOptions;
import com.mailjet.client.resource.ContactslistManagemanycontacts;
import org.json.JSONArray;
import org.json.JSONObject;
public class MyClass {
    public static void main(String[] args) throws MailjetException, MailjetSocketTimeoutException {
      MailjetClient client;
      MailjetRequest request;
      MailjetResponse response;
      client = new MailjetClient(System.getenv("MJ_APIKEY_PUBLIC"), System.getenv("MJ_APIKEY_PRIVATE"), new ClientOptions("v3"));
      request = new MailjetRequest(ContactslistManagemanycontacts.resource, ID)
            .property(ContactslistManagemanycontacts.ACTION, "addnoforce")
            .property(ContactslistManagemanycontacts.CONTACTS, new JSONArray()
                .put(new JSONObject()
                    .put("Email", "passenger@mailjet.com")
                    .put("IsExcludedFromCampaigns", "false")
                    .put("Name", "Passenger 1")
                    .put("Properties", "object")
                )
            )
      );
      response = client.post(request);
      System.out.println(response.getStatus());
      System.out.println(response.getData());
    }
}
```

Go
```go
package main
import (
	"fmt"
	"log"
	"os"
	mailjet "github.com/mailjet/mailjet-apiv3-go"
	"github.com/mailjet/mailjet-apiv3-go/resources"
)
func main () {
	mailjetClient := NewMailjetClient(os.Getenv("MJ_APIKEY_PUBLIC"), os.Getenv("MJ_APIKEY_PRIVATE"))
	var data []resources.ContactslistManagemanycontacts
	mr := &Request{
	  Resource: "contactslist",
	  ID: RESOURCE_ID,
	  Action: "managemanycontacts",
	}
	fmr := &FullRequest{
	  Info: mr,
	  Payload: &resources.ContactslistManagemanycontacts { 
	  Action:"addnoforce",
      Contacts: []MailjetContact {
          MailjetContact {
            Email:"passenger@mailjet.com",
            IsExcludedFromCampaigns:"false",
            Name:"Passenger 1",
            Properties:"object"
          }
        }
      }
	}
	err := mailjetClient.Post(fmr, &data)
	if err != nil {
	  fmt.Println(err)
	}
	fmt.Printf("Data array: %+v\n", data)
}
```

C#
```csharp
using Mailjet.Client;
using Mailjet.Client.Resources;
using System;
using Newtonsoft.Json.Linq;
namespace Mailjet.ConsoleApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         RunAsync().Wait();
      }
      static async Task RunAsync()
      {
         MailjetClient client = new MailjetClient(Environment.GetEnvironmentVariable("MJ_APIKEY_PUBLIC"), Environment.GetEnvironmentVariable("MJ_APIKEY_PRIVATE"))
         {
            Version = ApiVersion.V3,
         };
         MailjetRequest request = new MailjetRequest
         {
            Resource = ContactslistManagemanycontacts.Resource,
            ResourceId = ResourceId.Numeric(ID)
         }
             .Property(ContactslistManagemanycontacts.Action, "addnoforce")
             .Property(ContactslistManagemanycontacts.Contacts, new JArray {
                 new JObject {
                     {"Email", "passenger@mailjet.com"},
                     {"IsExcludedFromCampaigns", "false"},
                     {"Name", "Passenger 1"},
                     {"Properties", "object"}
                 }
             });
         MailjetResponse response = await client.PostAsync(request);
         if (response.IsSuccessStatusCode)
         {
            Console.WriteLine(string.Format("Total: {0}, Count: {1}\n", response.GetTotal(), response.GetCount()));
            Console.WriteLine(response.GetData());
         }
         else
         {
            Console.WriteLine(string.Format("StatusCode: {0}\n", response.StatusCode));
            Console.WriteLine(string.Format("ErrorInfo: {0}\n", response.GetErrorInfo()));
            Console.WriteLine(response.GetData());
            Console.WriteLine(string.Format("ErrorMessage: {0}\n", response.GetErrorMessage()));
         }
      }
   }
}
```

### API Response

```
{
	"Count": 1,
	"Data": [
		{
			"JobID": 54321
		}
	],
	"Total": 1
}
```

## Monitor the upload job

Use the JobID returned in the response of the POST `/contactslist/{list_ID}/managemanycontacts` request to follow the upload process. Do this with `GET /contactslist/{list_ID}/managemanycontacts/{job_ID}:`

### Example

cURL
```shell
curl -s \
	-X GET \
	--user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
	https://api.mailjet.com/v3/REST/contactslist/$list_ID/managemanycontacts \
```

PHP
```php
<?php
require 'vendor/autoload.php';
use \Mailjet\Resources;
$mj = new \Mailjet\Client(getenv('MJ_APIKEY_PUBLIC'), getenv('MJ_APIKEY_PRIVATE'),true,['version' => 'v3']);
$response = $mj->get(Resources::$ContactslistManagemanycontacts, ['id' => $id]);
$response->success() && var_dump($response->getData());
?>
```

Node.js
```javascript
const mailjet = require ('node-mailjet')
	.connect(process.env.MJ_APIKEY_PUBLIC, process.env.MJ_APIKEY_PRIVATE)
const request = mailjet
	.get("contactslist", {'version': 'v3'})
	.id($list_ID)
	.action("managemanycontacts")
	.id($job_ID)
	.request()
request
	.then((result) => {
		console.log(result.body)
	})
	.catch((err) => {
		console.log(err.statusCode)
	})
```

Ruby
```ruby
require 'mailjet'
Mailjet.configure do |config|
  config.api_key = ENV['MJ_APIKEY_PUBLIC']
  config.secret_key = ENV['MJ_APIKEY_PRIVATE']
  config.api_version = "v3"
end
variable = Mailjet::Contactslist_managemanycontacts.find($list_ID
)
p variable.attributes['Data']
```

Python
```python
from mailjet_rest import Client
import os
api_key = os.environ['MJ_APIKEY_PUBLIC']
api_secret = os.environ['MJ_APIKEY_PRIVATE']
mailjet = Client(auth=(api_key, api_secret), version='v3')
id = '$list_ID'
result = mailjet.contactslist_managemanycontacts.get(id=id)
print result.status_code
print result.json()
```

Java
```java
package com.my.project;
import com.mailjet.client.errors.MailjetException;
import com.mailjet.client.errors.MailjetSocketTimeoutException;
import com.mailjet.client.MailjetClient;
import com.mailjet.client.MailjetRequest;
import com.mailjet.client.MailjetResponse;
import com.mailjet.client.ClientOptions;
import com.mailjet.client.resource.ContactslistManagemanycontacts;
import org.json.JSONArray;
import org.json.JSONObject;
public class MyClass {
    public static void main(String[] args) throws MailjetException, MailjetSocketTimeoutException {
      MailjetClient client;
      MailjetRequest request;
      MailjetResponse response;
      client = new MailjetClient(System.getenv("MJ_APIKEY_PUBLIC"), System.getenv("MJ_APIKEY_PRIVATE"), new ClientOptions("v3"));
      request = new MailjetRequest(ContactslistManagemanycontacts.resource, ID);
      response = client.get(request);
      System.out.println(response.getStatus());
      System.out.println(response.getData());
    }
}
```

Go
```go
package main
import (
	"fmt"
	"log"
	"os"
	mailjet "github.com/mailjet/mailjet-apiv3-go"
	"github.com/mailjet/mailjet-apiv3-go/resources"
)
func main () {
	mailjetClient := NewMailjetClient(os.Getenv("MJ_APIKEY_PUBLIC"), os.Getenv("MJ_APIKEY_PRIVATE"))
	var data []resources.ContactslistManagemanycontacts
	mr := &Request{
	  Resource: "contactslist",
	  ID: RESOURCE_ID,
	  Action: "managemanycontacts",
	}
	err := mailjetClient.Get(mr, &data)
	if err != nil {
	  fmt.Println(err)
	}
	fmt.Printf("Data array: %+v\n", data)
}
```

C#
```csharp
using Mailjet.Client;
using Mailjet.Client.Resources;
using System;
using Newtonsoft.Json.Linq;
namespace Mailjet.ConsoleApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         RunAsync().Wait();
      }
      static async Task RunAsync()
      {
         MailjetClient client = new MailjetClient(Environment.GetEnvironmentVariable("MJ_APIKEY_PUBLIC"), Environment.GetEnvironmentVariable("MJ_APIKEY_PRIVATE"))
         {
            Version = ApiVersion.V3,
         };
         MailjetRequest request = new MailjetRequest
         {
            Resource = ContactslistManagemanycontacts.Resource,
            ResourceId = ResourceId.Numeric(ID)
         }
         MailjetResponse response = await client.GetAsync(request);
         if (response.IsSuccessStatusCode)
         {
            Console.WriteLine(string.Format("Total: {0}, Count: {1}\n", response.GetTotal(), response.GetCount()));
            Console.WriteLine(response.GetData());
         }
         else
         {
            Console.WriteLine(string.Format("StatusCode: {0}\n", response.StatusCode));
            Console.WriteLine(string.Format("ErrorInfo: {0}\n", response.GetErrorInfo()));
            Console.WriteLine(response.GetData());
            Console.WriteLine(string.Format("ErrorMessage: {0}\n", response.GetErrorMessage()));
         }
      }
   }
}
```

### API Response

```
{
	"Count": 1,
	"Data": [
		{
			"ContactsLists": [
				{
					"ListID": 987654321,
					"Action": "addnoforce"
				}
			],
			"Count": 1,
			"Error": "",
			"ErrorFile": "",
			"JobEnd": "2018-01-01T00:00:00",
			"JobStart": "2018-01-01T00:00:00",
			"Status": "Completed"
		}
	],
	"Total": 1
}
```