# KakaoTalk templates

KakaoTalk templates can be created for any project with a registered Sender.

Note that, for this guide, we provide **Node.js** code samples. However, the principles apply to any language you use to make requests to the API.

## Creating a template

The following code sample [creates a KakaoTalk template](/docs/provisioning-api/api-reference/provisioning-api/kakaotalk-templates/kakaotalktemplatescontroller_createtemplate_v1) using the Provisioning API.

```javascript
import fetch from 'node-fetch';

async function createTemplate() {
  const resp = await fetch(
    `https://provisioning.api.sinch.com/v1/projects/${PROJECT_ID}/kakaotalk/senders/${PLUS_FRIEND_ID}/templates`,
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        Authorization:
          'Basic ' +
          Buffer.from(ACCESS_KEY + ':' + ACCESS_SECRET).toString('base64'),
      },
      body: JSON.stringify({
        status: 'SUBMIT',
        details: {
          language: 'EN',
          messageType: 'BASIC',
          emphasizeType: 'EMPHASIZE_TYPE_NONE',
          categoryCode: '001001',
          securityFlag: false,
          name: 'Example name',
          content: 'Example content',
          extra: 'Example extra',
          title: 'Example title',
          subtitle: 'Example subtitle',
          imageName: 'Example image name',
          imageUrl: 'https://example-image-url.com',
          buttons: [
            {
              ordering: 1,
              type: 'APP_LINK',
              name: 'Example Name',
              linkMo: 'https://example-link-mo.com',
              linkPc: 'https://example-link-pc.com',
              schemeIos: 'https://example-scheme-ios.com',
              schemeAndroid: 'https://example-scheme-android.com',
            },
          ],
        },
      }),
    }
  );

  const data = await resp.json();
  return data;
}
```

Note that, within the `details` object, the `language`, `name`, and `content` fields are all required. For more information on the other fields included in this example, see the [API reference](/docs/provisioning-api/api-reference/provisioning-api/kakaotalk-templates/kakaotalktemplatescontroller_createtemplate_v1).

After creating a template, you can view it (and others) by using the [list templates](#listing-templates) operation.

## Listing templates

Use the [list templates operation](/docs/provisioning-api/api-reference/provisioning-api/kakaotalk-templates/kakaotalktemplatescontroller_listtemplates_v1) in a project to see a paginated list of templates for the specified project, including templates that are in progress.

The list is paginated, and the response will include a `nextPageToken` field if more pages are available.

```javascript

import fetch from 'node-fetch';

async function getAllApprovedTemplates(pageToken: string) {
  const resp = await fetch(
    `https://provisioning.api.sinch.com/v1/projects/${PROJECT_ID}/kakaotalk/senders/${PLUS_FRIEND_ID}/templates?pageToken=${pageToken}`,
    {
      method: 'GET',
      headers: {
        'Content-Type': 'application/json',
        Authorization:
          'Basic ' +
          Buffer.from(ACCESS_KEY + ':' + ACCESS_SECRET).toString('base64'),
      },
    }
  );

  let data = await resp.json();

  if (data.nextPageToken) {
    const nextData = await getAllApprovedTemplates(data.nextPageToken);

    return {
      ...data.templates,
      ...nextData.templates,
    };
  } else {
    return data.templates;
  }
}
```

The `state` of the returned template(s) will either be `APPROVED` or `REJECTED`. Additionally, the `status` field of the `changes` object will indicate the current status of changes applied to the draft (one of `IN_PROGRESS`, `REJECTED`, or `DRAFT`).