# Create a Template

Email templates are prewritten / preformatted emails, which are used to quickly send messages to your recipients. This helps you save time when needing to reuse content - instead of adding the email content every time, you can just reference the template ID.

You can create a template using our [Email Editor](https://app.mailjet.com/templates/marketing). To create a template via the API, use `POST /template`.

cURL
```shell
curl -s \
	-X POST \
	--user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
	https://api.mailjet.com/v3/REST/template \
	-H 'Content-Type: application/json' \
	-d '{
      "Author":"John Doe",
      "Categories":"array",
      "Copyright":"Mailjet",
      "Description":"Used to send out promo codes.",
      "EditMode":"1",
      "IsStarred":"false",
      "IsTextPartGenerationEnabled":"true",
      "Locale":"en_US",
      "Name":"Promo Codes",
      "OwnerType":"user",
      "Presets":"string",
      "Purposes":"array"
	}'
```

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 = [
  'Author' => "John Doe",
  'Categories' => "array",
  'Copyright' => "Mailjet",
  'Description' => "Used to send out promo codes.",
  'EditMode' => "1",
  'IsStarred' => "false",
  'IsTextPartGenerationEnabled' => "true",
  'Locale' => "en_US",
  'Name' => "Promo Codes",
  'OwnerType' => "user",
  'Presets' => "string",
  'Purposes' => "array"
];
$response = $mj->post(Resources::$Template, ['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("template", {'version': 'v3'})
	.request({
      "Author":"John Doe",
      "Categories":"array",
      "Copyright":"Mailjet",
      "Description":"Used to send out promo codes.",
      "EditMode":"1",
      "IsStarred":"false",
      "IsTextPartGenerationEnabled":"true",
      "Locale":"en_US",
      "Name":"Promo Codes",
      "OwnerType":"user",
      "Presets":"string",
      "Purposes":"array"
    })
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::Template.create(
  author: "John Doe",
  categories: "array",
  copyright: "Mailjet",
  description: "Used to send out promo codes.",
  edit_mode: "1",
  is_starred: "false",
  is_text_part_generation_enabled: "true",
  locale: "en_US",
  name: "Promo Codes",
  owner_type: "user",
  presets: "string",
  purposes: "array"
)
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')
data = {
  'Author': "John Doe",
  'Categories': "array",
  'Copyright': "Mailjet",
  'Description': "Used to send out promo codes.",
  'EditMode': "1",
  'IsStarred': "false",
  'IsTextPartGenerationEnabled': "true",
  'Locale': "en_US",
  'Name': "Promo Codes",
  'OwnerType': "user",
  'Presets': "string",
  'Purposes': "array"
}
result = mailjet.template.create(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.Template;
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(Template.resource)
            .property(Template.AUTHOR, "John Doe")
            .property(Template.CATEGORIES, "array")
            .property(Template.COPYRIGHT, "Mailjet")
            .property(Template.DESCRIPTION, "Used to send out promo codes.")
            .property(Template.EDITMODE, "1")
            .property(Template.ISSTARRED, "false")
            .property(Template.ISTEXTPARTGENERATIONENABLED, "true")
            .property(Template.LOCALE, "en_US")
            .property(Template.NAME, "Promo Codes")
            .property(Template.OWNERTYPE, "user")
            .property(Template.PRESETS, "string")
            .property(Template.PURPOSES, "array")
      );
      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.Template
	mr := &Request{
	  Resource: "template",
	}
	fmr := &FullRequest{
	  Info: mr,
	  Payload: &resources.Template { 
	  Author:"John Doe",
	  Categories:"array",
	  Copyright:"Mailjet",
	  Description:"Used to send out promo codes.",
	  EditMode:"1",
	  IsStarred:"false",
	  IsTextPartGenerationEnabled:"true",
	  Locale:"en_US",
	  Name:"Promo Codes",
	  OwnerType:"user",
	  Presets:"string",
	  Purposes:"array"
      }
	}
	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 = Template.Resource,
         }
             .Property(Template.Author, "John Doe")
             .Property(Template.Categories, "array")
             .Property(Template.Copyright, "Mailjet")
             .Property(Template.Description, "Used to send out promo codes.")
             .Property(Template.EditMode, "1")
             .Property(Template.IsStarred, "false")
             .Property(Template.IsTextPartGenerationEnabled, "true")
             .Property(Template.Locale, "en_US")
             .Property(Template.Name, "Promo Codes")
             .Property(Template.OwnerType, "user")
             .Property(Template.Presets, "string")
             .Property(Template.Purposes, "array");
         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()));
         }
      }
   }
}
```

To add the email content, use `POST /template/{template_ID}/detailcontent`. Keep in mind that the `POST` request will reset the values of all properties not specified in the payload to `null`. If you have already set a value to a property (e.g. `Html-part`) and want to keep it while setting the value of another (e.g. `Text-part`), use a `PUT` request instead.

cURL
```shell
curl -s \
	-X POST \
	--user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
	https://api.mailjet.com/v3/REST/template/$template_ID/detailcontent \
	-H 'Content-Type: application/json' \
	-d '{
      "Headers":"",
      "Html-part":"<h3>Dear passenger, welcome to Mailjet!</h3><br />May the delivery force be with you!",
      "MJMLContent":"",
      "Text-part":"Dear passenger, welcome to Mailjet! May the delivery force be with you!"
	}'
```

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 = [
  'Headers' => "",
  'Html-part' => "<h3>Dear passenger, welcome to Mailjet!</h3><br />May the delivery force be with you!",
  'MJMLContent' => "",
  'Text-part' => "Dear passenger, welcome to Mailjet! May the delivery force be with you!"
];
$response = $mj->post(Resources::$TemplateDetailcontent, ['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("template", {'version': 'v3'})
	.id($template_ID)
	.action("detailcontent")
	.request({
      "Headers":"",
      "Html-part":"<h3>Dear passenger, welcome to Mailjet!</h3><br />May the delivery force be with you!",
      "MJMLContent":"",
      "Text-part":"Dear passenger, welcome to Mailjet! May the delivery force be with you!"
    })
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::Template_detailcontent.create(id: $template_ID,
  headers: "",
  html_part: "<h3>Dear passenger, welcome to Mailjet!</h3><br />May the delivery force be with you!",
  mjmlcontent: "",
  text_part: "Dear passenger, welcome to Mailjet! May the delivery force be with you!"
)
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 = '$template_ID'
data = {
  'Headers': "",
  'Html-part': "<h3>Dear passenger, welcome to Mailjet!</h3><br />May the delivery force be with you!",
  'MJMLContent': "",
  'Text-part': "Dear passenger, welcome to Mailjet! May the delivery force be with you!"
}
result = mailjet.template_detailcontent.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.TemplateDetailcontent;
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(TemplateDetailcontent.resource, ID)
            .property(TemplateDetailcontent.HEADERS, )
            .property(TemplateDetailcontent.HTMLPART, "<h3>Dear passenger, welcome to Mailjet!</h3><br />May the delivery force be with you!")
            .property(TemplateDetailcontent.MJMLCONTENT, )
            .property(TemplateDetailcontent.TEXTPART, "Dear passenger, welcome to Mailjet! May the delivery force be with you!")
      );
      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.TemplateDetailcontent
	mr := &Request{
	  Resource: "template",
	  ID: RESOURCE_ID,
	  Action: "detailcontent",
	}
	fmr := &FullRequest{
	  Info: mr,
	  Payload: &resources.TemplateDetailcontent { 
	  Headers:"",
	  Html-part:"<h3>Dear passenger, welcome to Mailjet!</h3><br />May the delivery force be with you!",
	  MJMLContent:"",
	  Text-part:"Dear passenger, welcome to Mailjet! May the delivery force be with you!"
      }
	}
	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 = TemplateDetailcontent.Resource,
            ResourceId = ResourceId.Numeric(ID)
         }
             .Property(TemplateDetailcontent.Headers, )
             .Property(TemplateDetailcontent.Htmlpart, "<h3>Dear passenger, welcome to Mailjet!</h3><br />May the delivery force be with you!")
             .Property(TemplateDetailcontent.MJMLContent, )
             .Property(TemplateDetailcontent.Textpart, "Dear passenger, welcome to Mailjet! May the delivery force be with you!");
         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()));
         }
      }
   }
}
```

Use `Headers` to specify your sender and/or reply-to addresses, as well as the Subject line of your email.

### API Response Example

```
{
  "From": "\"Mailjet pilot\" <pilot@mailjet.com>",
  "Subject": "Welcome",
  "Reply-to": "copilot@mailjet.com"
}
```