Skip to content

外部公開API

連携先パートナー向けの公開APIリファレンスです。仕様は openapi/external-api.yaml を単一の情報源として自動生成しています。

⚠️ ベータ版:本APIは現在ベータ版として提供しています。エンドポイントの仕様は予告なく変更される可能性があります。

MALINE(メール・LINE・SMS配信基盤)の外部連携向けAPIです。
連携先システムからテナント単位で顧客・キャンペーン・メッセージを操作するために提供します。

⚠️ ベータ版について

本APIは現在ベータ版として提供しています。エンドポイントの仕様(パス・パラメータ・レスポンス形式等)は、
予告なく変更される可能性があります。本番システムへの組み込みの際はご注意ください。

認証

すべてのエンドポイントは Bearer トークン認証が必要です。
発行されたAPIトークンはテナントに紐づいており、リクエストはトークンの所有テナントのデータのみを対象とします
tenantId はレスポンスに含まれますが、リクエストで指定・変更することはできません)。

データの削除について

顧客・キャンペーン・メッセージの削除は論理削除です。DELETE を実行するとレコードに deletedAt が設定され、
一覧・詳細取得の対象から除外されますが、物理的にはデータベースから削除されません。
(顧客のキャンペーンからの解除は削除とは異なる操作です。「顧客のキャンペーンからの解除」を参照してください)

命名規則

リクエスト・レスポンスのJSONフィールドはすべてキャメルケースです。

レート制限

短時間に大量のリクエストを送信すると 429 Too Many Requests が返却される場合があります。

Contact

Servers

https://api.maline.jp/v1本番環境

顧客一覧を取得

GET
/customers

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Parameters

Query Parameters

page

ページ番号(1始まり)

Type
integer
Minimum
1
Default
1
perPage

1ページあたりの件数

Type
integer
Minimum
1
Maximum
100
Default
20
email

メールアドレスの完全一致で絞り込み

Type
string
Format
"email"
status

ステータスで絞り込み

Type
string
Valid values
"ACTIVE""INACTIVE""WITHDRAWN"

Responses

顧客一覧

application/json
JSON
{
  
"data": [
  
  
{
  
  
  
"id": "01J8Z3K9Q6R7S8T9U0V1W2X3Y4",
  
  
  
"tenantId": "string",
  
  
  
"customerDomainId": "string",
  
  
  
"lineUserId": "string",
  
  
  
"salesforceContactRef": "string",
  
  
  
"status": "string",
  
  
  
"name": "山田 太郎",
  
  
  
"email": "string",
  
  
  
"company": "string",
  
  
  
"postcode": "string",
  
  
  
"address": "string",
  
  
  
"tel": "string",
  
  
  
"token": "string",
  
  
  
"isBlocked": true,
  
  
  
"customFields": [
  
  
  
  
{
  
  
  
  
  
"code": "member_rank",
  
  
  
  
  
"value": "ゴールド"
  
  
  
  
}
  
  
  
],
  
  
  
"createdAt": "string",
  
  
  
"updatedAt": "string",
  
  
  
"deletedAt": "string"
  
  
}
  
],
  
"meta": {
  
  
"currentPage": 1,
  
  
"perPage": 20,
  
  
"lastPage": 5,
  
  
"total": 96
  
}
}

Playground

Authorization
Variables
Key
Value

Samples


顧客を登録

POST
/customers

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Request Body

application/json
JSON
{
  
"lineUserId": "string",
  
"salesforceContactRef": "string",
  
"status": "ACTIVE",
  
"name": "string",
  
"email": "string",
  
"company": "string",
  
"postcode": "string",
  
"address": "string",
  
"tel": "string",
  
"customFields": [
  
  
{
  
  
  
"code": "member_rank",
  
  
  
"value": "ゴールド"
  
  
}
  
]
}

Responses

登録した顧客

application/json
JSON
{
  
"id": "01J8Z3K9Q6R7S8T9U0V1W2X3Y4",
  
"tenantId": "string",
  
"customerDomainId": "string",
  
"lineUserId": "string",
  
"salesforceContactRef": "string",
  
"status": "string",
  
"name": "山田 太郎",
  
"email": "string",
  
"company": "string",
  
"postcode": "string",
  
"address": "string",
  
"tel": "string",
  
"token": "string",
  
"isBlocked": true,
  
"customFields": [
  
  
{
  
  
  
"code": "member_rank",
  
  
  
"value": "ゴールド"
  
  
}
  
],
  
"createdAt": "string",
  
"updatedAt": "string",
  
"deletedAt": "string"
}

Playground

Authorization
Body

Samples


顧客詳細を取得

GET
/customers/{customerId}

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Responses

顧客詳細

application/json
JSON
{
  
"id": "01J8Z3K9Q6R7S8T9U0V1W2X3Y4",
  
"tenantId": "string",
  
"customerDomainId": "string",
  
"lineUserId": "string",
  
"salesforceContactRef": "string",
  
"status": "string",
  
"name": "山田 太郎",
  
"email": "string",
  
"company": "string",
  
"postcode": "string",
  
"address": "string",
  
"tel": "string",
  
"token": "string",
  
"isBlocked": true,
  
"customFields": [
  
  
{
  
  
  
"code": "member_rank",
  
  
  
"value": "ゴールド"
  
  
}
  
],
  
"createdAt": "string",
  
"updatedAt": "string",
  
"deletedAt": "string"
}

Playground

Authorization

Samples


顧客を削除(論理削除)

DELETE
/customers/{customerId}

顧客を論理削除します。削除された顧客が登録されていたキャンペーンの購読状態はそのまま保持されます
(配信対象からは自動的に除外されます)。

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Responses

削除成功(本文なし)

Playground

Authorization

Samples


顧客を更新

PATCH
/customers/{customerId}

指定したフィールドのみ更新します(部分更新)。

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Request Body

application/json
JSON
{
  
"lineUserId": "string",
  
"salesforceContactRef": "string",
  
"status": "string",
  
"name": "string",
  
"email": "string",
  
"company": "string",
  
"postcode": "string",
  
"address": "string",
  
"tel": "string",
  
"customFields": [
  
  
{
  
  
  
"code": "member_rank",
  
  
  
"value": "ゴールド"
  
  
}
  
]
}

Responses

更新後の顧客

application/json
JSON
{
  
"id": "01J8Z3K9Q6R7S8T9U0V1W2X3Y4",
  
"tenantId": "string",
  
"customerDomainId": "string",
  
"lineUserId": "string",
  
"salesforceContactRef": "string",
  
"status": "string",
  
"name": "山田 太郎",
  
"email": "string",
  
"company": "string",
  
"postcode": "string",
  
"address": "string",
  
"tel": "string",
  
"token": "string",
  
"isBlocked": true,
  
"customFields": [
  
  
{
  
  
  
"code": "member_rank",
  
  
  
"value": "ゴールド"
  
  
}
  
],
  
"createdAt": "string",
  
"updatedAt": "string",
  
"deletedAt": "string"
}

Playground

Authorization
Body

Samples


Campaigns


キャンペーン一覧を取得

GET
/campaigns

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Parameters

Query Parameters

page

ページ番号(1始まり)

Type
integer
Minimum
1
Default
1
perPage

1ページあたりの件数

Type
integer
Minimum
1
Maximum
100
Default
20
status
Type
string
Valid values
"ACTIVE""ARCHIVED"

Responses

キャンペーン一覧

application/json
JSON
{
  
"data": [
  
  
{
  
  
  
"id": "string",
  
  
  
"tenantId": "string",
  
  
  
"type": "string",
  
  
  
"status": "string",
  
  
  
"code": "string",
  
  
  
"name": "string",
  
  
  
"smsSenderId": "string",
  
  
  
"senderId": "string",
  
  
  
"createdAt": "string",
  
  
  
"updatedAt": "string",
  
  
  
"deletedAt": "string"
  
  
}
  
],
  
"meta": {
  
  
"currentPage": 1,
  
  
"perPage": 20,
  
  
"lastPage": 5,
  
  
"total": 96
  
}
}

Playground

Authorization
Variables
Key
Value

Samples


キャンペーンを登録

POST
/campaigns

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Request Body

application/json
JSON
{
  
"type": "string",
  
"code": "string",
  
"name": "string",
  
"smsSenderId": "string",
  
"senderId": "string",
  
"status": "ACTIVE"
}

Responses

登録したキャンペーン

application/json
JSON
{
  
"id": "string",
  
"tenantId": "string",
  
"type": "string",
  
"status": "string",
  
"code": "string",
  
"name": "string",
  
"smsSenderId": "string",
  
"senderId": "string",
  
"createdAt": "string",
  
"updatedAt": "string",
  
"deletedAt": "string"
}

Playground

Authorization
Body

Samples


キャンペーン詳細を取得

GET
/campaigns/{campaignId}

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Responses

キャンペーン詳細

application/json
JSON
{
  
"id": "string",
  
"tenantId": "string",
  
"type": "string",
  
"status": "string",
  
"code": "string",
  
"name": "string",
  
"smsSenderId": "string",
  
"senderId": "string",
  
"createdAt": "string",
  
"updatedAt": "string",
  
"deletedAt": "string"
}

Playground

Authorization

Samples


キャンペーンを削除(論理削除)

DELETE
/campaigns/{campaignId}

削除するとキャンペーンは ARCHIVED 扱いとなり、以降このキャンペーン経由でのメッセージ配信は行われません。

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Responses

削除成功(本文なし)

Playground

Authorization

Samples


キャンペーンを更新

PATCH
/campaigns/{campaignId}

指定したフィールドのみ更新します(部分更新)。type はキャンペーン作成後に変更できません。

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Request Body

application/json
JSON
{
  
"code": "string",
  
"name": "string",
  
"status": "string",
  
"smsSenderId": "string",
  
"senderId": "string"
}

Responses

更新後のキャンペーン

application/json
JSON
{
  
"id": "string",
  
"tenantId": "string",
  
"type": "string",
  
"status": "string",
  
"code": "string",
  
"name": "string",
  
"smsSenderId": "string",
  
"senderId": "string",
  
"createdAt": "string",
  
"updatedAt": "string",
  
"deletedAt": "string"
}

Playground

Authorization
Body

Samples


キャンペーンへの顧客登録状況の一覧を取得

GET
/campaign-customers

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Parameters

Query Parameters

page

ページ番号(1始まり)

Type
integer
Minimum
1
Default
1
perPage

1ページあたりの件数

Type
integer
Minimum
1
Maximum
100
Default
20
campaignId

キャンペーンIDで絞り込み

Type
string
customerId

顧客IDで絞り込み

Type
string
status
Type
string
Valid values
"SUBSCRIBED""UNSUBSCRIBED"

Responses

登録状況の一覧

application/json
JSON
{
  
"data": [
  
  
{
  
  
  
"id": "string",
  
  
  
"campaignId": "string",
  
  
  
"customerId": "string",
  
  
  
"status": "string",
  
  
  
"subscribedAt": "string",
  
  
  
"unsubscribedAt": "string",
  
  
  
"unsubscribedReason": "string",
  
  
  
"createdAt": "string",
  
  
  
"updatedAt": "string"
  
  
}
  
],
  
"meta": {
  
  
"currentPage": 1,
  
  
"perPage": 20,
  
  
"lastPage": 5,
  
  
"total": 96
  
}
}

Playground

Authorization
Variables
Key
Value

Samples


顧客をキャンペーンに登録

POST
/campaign-customers

指定した顧客を指定したキャンペーンの配信対象として登録(購読)します。

  • 既に購読中の場合は 409 Conflict を返します。
  • 過去に解除済み(UNSUBSCRIBED)の組み合わせに対して再度登録した場合は、
    既存のレコードを SUBSCRIBED に更新し 200 OK を返します(新規作成時は 201 Created)。

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Request Body

application/json
JSON
{
  
"campaignId": "string",
  
"customerId": "string"
}

Responses

解除済みだった登録を再度有効化した場合

application/json
JSON
{
  
"id": "string",
  
"campaignId": "string",
  
"customerId": "string",
  
"status": "string",
  
"subscribedAt": "string",
  
"unsubscribedAt": "string",
  
"unsubscribedReason": "string",
  
"createdAt": "string",
  
"updatedAt": "string"
}

Playground

Authorization
Body

Samples


キャンペーンへの顧客登録状況の詳細を取得

GET
/campaign-customers/{campaignCustomerId}

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Responses

登録状況の詳細

application/json
JSON
{
  
"id": "string",
  
"campaignId": "string",
  
"customerId": "string",
  
"status": "string",
  
"subscribedAt": "string",
  
"unsubscribedAt": "string",
  
"unsubscribedReason": "string",
  
"createdAt": "string",
  
"updatedAt": "string"
}

Playground

Authorization

Samples


顧客をキャンペーンから解除

DELETE
/campaign-customers/{campaignCustomerId}

顧客をキャンペーンの配信対象から解除(購読解除)します。
これは「削除」ではなく、ステータスを UNSUBSCRIBED に変更する操作です。
登録の履歴(subscribedAt など)はレコードごと保持されます。

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Request Body

application/json
JSON
{
  
"unsubscribedReason": "string"
}

Responses

解除後の登録状況

application/json
JSON
{
  
"id": "string",
  
"campaignId": "string",
  
"customerId": "string",
  
"status": "string",
  
"subscribedAt": "string",
  
"unsubscribedAt": "string",
  
"unsubscribedReason": "string",
  
"createdAt": "string",
  
"updatedAt": "string"
}

Playground

Authorization
Body

Samples


Messages


メッセージ一覧を取得

GET
/messages

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Parameters

Query Parameters

page

ページ番号(1始まり)

Type
integer
Minimum
1
Default
1
perPage

1ページあたりの件数

Type
integer
Minimum
1
Maximum
100
Default
20
campaignId
Type
string
method
Type
string
Valid values
"EMAIL""SMS""LINE"
status
Type
string
Valid values
"DRAFT""SCHEDULED""SENDING""SENT""ERROR"

Responses

メッセージ一覧

application/json
JSON
{
  
"data": [
  
  
{
  
  
  
"id": "string",
  
  
  
"tenantId": "string",
  
  
  
"campaignId": "string",
  
  
  
"method": "string",
  
  
  
"type": "string",
  
  
  
"status": "string",
  
  
  
"subject": "string",
  
  
  
"bodyText": "string",
  
  
  
"bodyHtml": "string",
  
  
  
"senderId": "string",
  
  
  
"domainId": "string",
  
  
  
"lineChannelId": "string",
  
  
  
"sendTiming": "string",
  
  
  
"sendsAt": "string",
  
  
  
"urlTrackingEnabled": true,
  
  
  
"isPromotional": true,
  
  
  
"createdAt": "string",
  
  
  
"updatedAt": "string",
  
  
  
"deletedAt": "string"
  
  
}
  
],
  
"meta": {
  
  
"currentPage": 1,
  
  
"perPage": 20,
  
  
"lastPage": 5,
  
  
"total": 96
  
}
}

Playground

Authorization
Variables
Key
Value

Samples


メッセージを登録

POST
/messages

指定したキャンペーンに紐づくメッセージを登録します。

  • isDraft: true の場合、ステータスは DRAFT になり配信対象は作成されません。
  • isDraft: false の場合、ステータスは SCHEDULED になり、キャンペーンを購読中の顧客に対して配信対象(Delivery)が作成されます。
    sendTiming: IMMEDIATE であればバッチ処理により即座に、SCHEDULED であれば sendsAt の日時に配信されます。
  • method: EMAIL の場合、subjectsenderIdtype は必須です。
  • sendTiming: SCHEDULED かつ isDraft: false の場合、sendsAt(未来日時)は必須です。
  • method: EMAIL かつ isPromotional: true(デフォルト)の場合、本文に配信停止URLのプレースホルダー
    {{ 配信停止URL }} を含める必要があります(type に応じて bodyTextbodyHtml を検証します)。
    含まれない場合は 422 を返します。
  • 送信元ドメインが公式ドメインの場合、本文に規定のフッター文言を含める必要があります(同様に 422)。
  • method: LINE の場合、bodyText の内容がテキストメッセージとして送信されます。

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Request Body

application/json
JSON
{
  
"campaignId": "string",
  
"method": "string",
  
"isDraft": true,
  
"type": "string",
  
"subject": "string",
  
"bodyText": "string",
  
"bodyHtml": "string",
  
"senderId": "string",
  
"lineChannelId": "string",
  
"sendTiming": "IMMEDIATE",
  
"sendsAt": "string",
  
"urlTrackingEnabled": true,
  
"isPromotional": true
}

Responses

登録したメッセージ

application/json
JSON
{
  
"id": "string",
  
"tenantId": "string",
  
"campaignId": "string",
  
"method": "string",
  
"type": "string",
  
"status": "string",
  
"subject": "string",
  
"bodyText": "string",
  
"bodyHtml": "string",
  
"senderId": "string",
  
"domainId": "string",
  
"lineChannelId": "string",
  
"sendTiming": "string",
  
"sendsAt": "string",
  
"urlTrackingEnabled": true,
  
"isPromotional": true,
  
"createdAt": "string",
  
"updatedAt": "string",
  
"deletedAt": "string"
}

Playground

Authorization
Body

Samples


メッセージ詳細を取得

GET
/messages/{messageId}

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Responses

メッセージ詳細

application/json
JSON
{
  
"id": "string",
  
"tenantId": "string",
  
"campaignId": "string",
  
"method": "string",
  
"type": "string",
  
"status": "string",
  
"subject": "string",
  
"bodyText": "string",
  
"bodyHtml": "string",
  
"senderId": "string",
  
"domainId": "string",
  
"lineChannelId": "string",
  
"sendTiming": "string",
  
"sendsAt": "string",
  
"urlTrackingEnabled": true,
  
"isPromotional": true,
  
"createdAt": "string",
  
"updatedAt": "string",
  
"deletedAt": "string"
}

Playground

Authorization

Samples


メッセージを削除(論理削除)

DELETE
/messages/{messageId}

削除できるのはステータスが DRAFT または SCHEDULED のメッセージのみです。配信中・配信済みのメッセージは削除できません。

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Responses

削除成功(本文なし)

Playground

Authorization

Samples


メッセージを更新

PATCH
/messages/{messageId}

指定したフィールドのみ更新します(部分更新)。
更新できるのはステータスが DRAFT または SCHEDULED のメッセージのみです。
campaignIdmethod は作成後に変更できません。
isDraft: false を指定(または既に false)の場合、配信対象(Delivery)は最新の内容で再作成されます。

Authorizations

bearerAuth

テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。

Type
HTTP (bearer)

Request Body

application/json
JSON
{
  
"isDraft": true,
  
"type": "string",
  
"subject": "string",
  
"bodyText": "string",
  
"bodyHtml": "string",
  
"senderId": "string",
  
"lineChannelId": "string",
  
"sendTiming": "string",
  
"sendsAt": "string",
  
"urlTrackingEnabled": true,
  
"isPromotional": true
}

Responses

更新後のメッセージ

application/json
JSON
{
  
"id": "string",
  
"tenantId": "string",
  
"campaignId": "string",
  
"method": "string",
  
"type": "string",
  
"status": "string",
  
"subject": "string",
  
"bodyText": "string",
  
"bodyHtml": "string",
  
"senderId": "string",
  
"domainId": "string",
  
"lineChannelId": "string",
  
"sendTiming": "string",
  
"sendsAt": "string",
  
"urlTrackingEnabled": true,
  
"isPromotional": true,
  
"createdAt": "string",
  
"updatedAt": "string",
  
"deletedAt": "string"
}

Playground

Authorization
Body

Samples


Maline テナント向けヘルプ