Appearance
外部公開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
1Default
1perPage
1ページあたりの件数
Type
integer
Minimum
1Maximum
100Default
20email
メールアドレスの完全一致で絞り込み
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 }
{
}
顧客を登録
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"
{
}
顧客詳細を取得
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"
{
}
顧客を削除(論理削除)
顧客を更新
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"
{
}
キャンペーン一覧を取得
GET
/campaigns
Authorizations
bearerAuth
テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。
Type
HTTP (bearer)
Parameters
Query Parameters
page
ページ番号(1始まり)
Type
integer
Minimum
1Default
1perPage
1ページあたりの件数
Type
integer
Minimum
1Maximum
100Default
20status
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 }
{
}
キャンペーンを登録
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"
{
}
キャンペーン詳細を取得
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"
{
}
キャンペーンを削除(論理削除)
キャンペーンを更新
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"
{
}
キャンペーンへの顧客登録状況の一覧を取得
GET
/campaign-customers
Authorizations
bearerAuth
テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。
Type
HTTP (bearer)
Parameters
Query Parameters
page
ページ番号(1始まり)
Type
integer
Minimum
1Default
1perPage
1ページあたりの件数
Type
integer
Minimum
1Maximum
100Default
20campaignId
キャンペーン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 }
{
}
顧客をキャンペーンに登録
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"
{
}
キャンペーンへの顧客登録状況の詳細を取得
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"
{
}
顧客をキャンペーンから解除
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"
{
}
メッセージ一覧を取得
GET
/messages
Authorizations
bearerAuth
テナントに発行された個人アクセストークン(Laravel Sanctum)を
Authorization: Bearer {token} ヘッダーで送信してください。
Type
HTTP (bearer)
Parameters
Query Parameters
page
ページ番号(1始まり)
Type
integer
Minimum
1Default
1perPage
1ページあたりの件数
Type
integer
Minimum
1Maximum
100Default
20campaignId
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 }
{
}
メッセージを登録
POST
/messages
指定したキャンペーンに紐づくメッセージを登録します。
isDraft: trueの場合、ステータスはDRAFTになり配信対象は作成されません。isDraft: falseの場合、ステータスはSCHEDULEDになり、キャンペーンを購読中の顧客に対して配信対象(Delivery)が作成されます。
sendTiming: IMMEDIATEであればバッチ処理により即座に、SCHEDULEDであればsendsAtの日時に配信されます。method: EMAILの場合、subject・senderId・typeは必須です。sendTiming: SCHEDULEDかつisDraft: falseの場合、sendsAt(未来日時)は必須です。method: EMAILかつisPromotional: true(デフォルト)の場合、本文に配信停止URLのプレースホルダー
{{ 配信停止URL }}を含める必要があります(typeに応じてbodyText/bodyHtmlを検証します)。
含まれない場合は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"
{
}
メッセージ詳細を取得
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"
{
}
メッセージを削除(論理削除)
メッセージを更新
PATCH
/messages/{messageId}
指定したフィールドのみ更新します(部分更新)。
更新できるのはステータスが DRAFT または SCHEDULED のメッセージのみです。
campaignId と method は作成後に変更できません。
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"
{
}