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

以前に削除した顧客と同じメールアドレスを指定した場合は、その顧客を戻して送られた内容で更新し、登録として返します(顧客の ID と配信停止URLは削除前と同じです)。

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""PENDING_APPROVAL""REJECTED""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 の日時に配信されます。
  • ただし次の場合、ステータスは PENDING_APPROVAL(承認待ち)になり、運営が確認するまで配信されません。
    許可されると SCHEDULED に戻り、却下されると REJECTED になります。
    • テナントの最初の配信(送信元のドメインや method を問わない)
    • 配信内容の確認でフィッシングなどが疑われた場合、または確認できなかった場合
  • 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"
}

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・PENDING_APPROVAL・REJECTED のメッセージのみです。配信中・配信済みのメッセージは削除できません。

Authorizations​

bearerAuth

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

Type
HTTP (bearer)

Responses​

削除成功(本文なし)

Playground​

Authorization

Samples​


メッセージを更新​

PATCH
/messages/{messageId}

指定したフィールドのみ更新します(部分更新)。
更新できるのはステータスが DRAFT・SCHEDULED・PENDING_APPROVAL・REJECTED のメッセージのみです。
PENDING_APPROVAL・REJECTED のメッセージを isDraft: false で更新すると、承認が要るかの判定がもう一度行われます
(最初の配信の確認が済んでいない場合や、配信内容の確認で疑われた場合は PENDING_APPROVAL に戻ります)。
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"
}

Playground​

Authorization
Body

Samples​


MALINE テナント向けヘルプ