REST API リファレンス

すべてのパスは、https://shopify.workflow-transactional-email.app を基準としています。index 以外のすべてのエンドポイントには、Authorization: Bearer fak_... が必要です。詳細は 認証とAPIキー をご覧ください。

応答はJSON形式です。エラーの形式はすべて同じです:

json
{ "error": "Invalid or missing API key" }

指標と同一性

方法 パス レベル 目的
GET /api/v1 なし APIインデックス。APIが稼働中であることを確認し、現在のリリース情報を報告します。
GET /api/v1/me 読む キーが機能するかどうかを確認し、そのアクセスレベルを確認してください

このインデックスにはキーが不要ですので、モニターを向けさせるのに適した安全なヘルスチェックとなります。

メールのレイアウト

方法 パス レベル 目的
GET /api/v1/email-templates 読む メールのレイアウト一覧を表示します。q では、名前、件名、説明文で検索できます。category=transactional または category=marketing では、1つのメールタイプの一覧が表示されます。
投稿 /api/v1/email-templates 書く レイアウトを作成する
GET /api/v1/email-templates/:id 読む 1つのレイアウトとそのデザインや添付ファイル、フッターのテキスト、および対応言語の一覧
PUT / PATCH /api/v1/email-templates/:id 書く レイアウトを変更します。送信されるのは、変更したフィールドのみです。
DELETE /api/v1/email-templates/:id 書く レイアウトとその翻訳およびバージョンを削除する
GET /api/v1/layout-schema 読む レイアウトの作成方法:デザイン形式、各ブロックのデフォルト設定、使用可能なLiquid、制限事項、および例

このリストでは、page(デフォルト値:1)、limit(デフォルト値:25、最大値:100)、およびq(名前、件名、説明を検索)が指定可能です。API ではタイプによるフィルタリングは行われません。代わりに、各レイアウトに関する category をご参照ください。

レイアウトには、以下のフィールドがあります:

フィールド 注記
name, description 名前は必須で、最大200文字までです。説明は最大2000文字までです。
bodyType visual (デフォルト)または text。一度作成されると変更できません
defaultLocale レイアウト自体のコンテンツの言語です。設定されていない場合は、en となります。
category transactional (デフォルト)または marketing。詳細は以下をご覧ください。
subject, previewText 飲み物の持ち込みは可能です。科目の履修が必須です。
bodyDesign ビジュアルレイアウト:{ blocks, global?, header?, footer?, testVariables? }。変更の際は、完成したデザインを送ってください。HTML(body)はそこから生成されます。
body テキストのレイアウト:HTMLのbody要素
attachments テキストのレイアウト:アップロードされたファイルの場合は [{ filename, fileKey, sendAsLink? }] (以下のファイルをご参照ください)、またはメール送信時に https 経由で取得されるファイルの場合は [{ filename, url }] をご覧ください。
marketingTexts マーケティング用レイアウトのフッターテキスト、あるいはnull。詳細は以下をご覧ください。

対象の「Liquid」、プレビューテキスト、本文、およびすべてのブロックテキストはパースされる必要があり、すべてのfileKeyはお客様のショップに属している必要があります。そうでない場合、そのフィールド名を指定した400エラーにより書き込みが拒否されます。ビジュアルデザインを作成する前に、GET /api/v1/layout-schema をお読みください。これはビルダー自体によって生成されるため、内容がずれることはありません。

このAPIを介して行われるすべての書き込みは、アプリでの保存とまったく同じように、レイアウトのバージョン履歴に記録されます。

トランザクション用およびマーケティング用のレイアウト

category レイアウトの目的について説明しています。トランザクション用レイアウトは、変更を加えることなくすべての受信者に送信されます。 マーケティング用レイアウトは、配信停止登録済みの受信者を除外し(このステップでは、「To」受信者全員が配信停止登録済みの場合は送信されず、履歴には「SKIPPED」と表示されます)、各「To」受信者ごとに個別の配信停止リンクを含む1通のメッセージとして送信され(1ステップあたり最大20通)、最後に配信停止に関する文言と貴社の詳細情報が記載されます。{{ unsubscribe_url }} および {{ unsubscribe_link }} には、ご自身でリンクを配置してください。トランザクション用レイアウトでは、これら両方が空欄となっています。これに関するマーチャント側の情報は、マーケティングメールと配信停止 に記載されています。

marketingTexts フッターの文言は、設定にある「サイト全体」のテキストの代わりに、マーケティングレイアウトで使用されるものですか:

json
{
  "marketingTexts": {
    "unsubscribeText": "You get this because you shop with us. {{ unsubscribe_link }}",
    "unsubscribeLinkLabel": "Unsubscribe",
    "companyDetails": "Example GmbH, Musterstrasse 1, 10115 Berlin"
  }
}

すべてのフィールドは任意です。設定されたフィールドは、そのフィールドの「設定」テキストを置き換えます。それ以外のフィールドはそのまま残ります。「null」(デフォルト)は、メールの言語に対応する「設定」テキストを意味します。制限:unsubscribeText および companyDetails は 2000 文字、unsubscribeLinkLabel は 100 文字です。 unsubscribeTextには、{{ unsubscribe_link }}または{{ unsubscribe_url }}が含まれている必要があります。そうでない場合、書き込みは拒否されます。このフィールドはどのレイアウトでも保存されますが、送信されるのはマーケティング用レイアウトの場合のみです。

レイアウトの削除は、いかなる場合でもブロックされることはありません。Shopify Flowのステップがまだそのレイアウトを参照している場合、レスポンスにはwarningというパラメータが含まれ、その数が示されます。それらのステップは、別のレイアウトを使用するまで失敗します。

翻訳

方法 パス レベル 目的
GET /api/v1/email-templates/:id/translations 読む レイアウトに含まれるすべての言語とそのコンテンツ
GET /api/v1/email-templates/:id/translations/:locale 読む 一つの言語
PUT /api/v1/email-templates/:id/translations/:locale 書く 1つの言語を作成または上書きする
DELETE /api/v1/email-templates/:id/translations/:locale 書く 1つの言語を削除します。その言語が削除されると、レイアウトがフォールバックします。
投稿 /api/v1/email-templates/:id/translations/:locale/promote 書く その言語をレイアウトのメイン言語に設定してください

:locale de、fr、pt-br などの言語コードです。大文字小文字や区切り文字は問いません。1つのレイアウトにつき最大30言語まで指定できます。「Shopify Flow」ステップの**「Language**」フィールドでは、送信時に以下の順序で言語が選択されます:正確なロケール、次に基本言語、その次に地域別バリエーション、それ以外の場合はレイアウト自体となります。

PUTは、翻訳済みのコンテンツ全体(subject(必須)、previewText、およびbodyDesign(画像)またはbody(テキスト))を受け取ります。LiquidタグとURLは変更しないでください。翻訳に固有のフィールドは2つあります:

フィールド テキストのレイアウト 意味
attachments はい リスト(レイアウトと同じ形式)=その言語固有の添付ファイル、[]=その言語には添付ファイルなし。null=レイアウトの添付ファイルを送信します。省略=現在の選択を維持します。新しい言語では、レイアウトのものが使用されます。ビジュアルレイアウトは、各言語のbodyDesign内にブロックとして添付ファイルを保持しており、このフィールドは使用しません。
marketingTexts いずれか この言語のフッターテキストは、レイアウトのフッターテキストの上に、フィールドごとに表示されます。「null」はレイアウトのフッターテキストを指します。「Omitted」は現在の選択内容を維持することを意味します。

翻訳結果には、同じ2つのフィールドが含まれています。「attachments」は「null」となり、レイアウトの値が返されます。また、「marketingTexts」は「null」となり、レイアウトの値が使用されます。

promote レイアウトと翻訳を入れ替えます。レイアウトは翻訳の内容とロケールを受け継ぎ、もともと持っていた内容は、以前属していた言語の翻訳となります。 添付ファイルやフッターのテキストも入れ替わりますので、各言語では以前と同じ内容を送信し続けます。レスポンスには、promoted、previousMainLanguage、およびレイアウトが返されます。これは1つのバージョンであるため、元に戻すことが可能です。

バージョン

方法 パス レベル 目的
GET /api/v1/email-templates/:id/versions 読む 保存されたバージョンを、新しい順に表示します。このアプリは最新の25件を保存します。
GET /api/v1/email-templates/:id/versions/:version 読む あるバージョンの完全なスナップショット:レイアウトおよびすべての翻訳
投稿 /api/v1/email-templates/:id/versions/:version/restore 書く そのバージョンを元に戻してください。新しいバージョンとして録音されました。
GET /api/v1/email-templates/:id/versions/github?page= 読む 接続されたGitHubリポジトリに保存されているすべてのバージョン(1ページにつき20件)
GET /api/v1/email-templates/:id/versions/github/:sha 読む あるコミット時点でのレイアウトは以下の通りでした
投稿 /api/v1/email-templates/:id/versions/github/:sha/restore 書く GitHubのバージョンを元に戻し、保存のようにチェックします

「Developer」ページでリポジトリが接続されていない場合、GitHubのエンドポイントから409エラーが返されます。詳細は、レイアウトのバージョン履歴 および GitHubでレイアウトの履歴を無制限に保存する をご覧ください。

メールの送信者

方法 パス レベル 目的
GET /api/v1/smtp-configs 読む SMTP送信元の一覧
GET /api/v1/senders 読む 接続済みのメールボックスを一覧表示する(Microsoft 365、Google)

SMTPの送信者は、認証情報そのものではなく、「hasUsername」や「hasPassword」といった形式で報告します。ユーザー名はパスワードと同様に認証情報の一部であるため、両方の部分が非表示にされています。送信者は、その名前、ホスト、および送信元アドレスによって識別可能です。接続されたメールボックスは、「so***@example.com」のような一部がマスクされたアドレスを報告し、サインイントークンを報告することは決してありません。

読み取り専用です。アプリ内で送信者を登録・編集してください。

秘密

方法 パス レベル 目的
GET /api/v1/secrets 読む 秘密の名前と説明をリストアップしてください

hasValue を返しますが、値自体は決して返されません。シークレットを読み取るエンドポイントはありません。アプリ内でシークレットを作成および更新してください。

アップロードされたファイル

方法 パス レベル 目的
GET /api/v1/files 読む アップロードされたロゴ、画像、および添付ファイルの一覧
DELETE /api/v1/files 書く 本文中の「key」の記述を1か所削除してください

リストには、page、limit(最大100件)、およびqを指定して、ファイル名による検索を行うことができます。

?usage=true を追加すると、各ファイルには「inUse」に加え、それを参照しているレイアウトやプリセットの名前が記載された「usedBy」配列も表示されます。これにより、1回のリクエストで安全に削除できる項目をすべて特定できます。この機能はレイアウトやプリセットをスキャンするため、デフォルトでは有効になっておらず、明示的に有効にする必要があります。

ここではアップロード機能は提供されていません。アプリ内のメディアピッカーからファイルを追加してください。

HTTPリクエスト

方法 パス レベル 目的
GET /api/v1/http-requests 読む HTTPリクエストの一覧を表示する
投稿 /api/v1/http-requests 書く 1つ作成する
GET /api/v1/http-requests/:id 読む 1つお求めください
PUT / PATCH /api/v1/http-requests/:id 書く アップデートその1
DELETE /api/v1/http-requests/:id 書く 1つ削除してください
投稿 /api/v1/http-requests/:id/test 実行する 実際のターゲットに対して実行してください

Listでは、メールレイアウトと同様に、page、limit、qの各パラメータを受け付けます。

対象の url は、http:// または https:// でなければなりません。それ以外の形式の場合は、保存時に拒否されます。

ヘッダーや本文に直接記述された認証情報は、すべてのレスポンスにおいてマスクされます。{{ secrets.KEY }} として参照される値は、参照自体に機密性がないため、記述されたままの形で返されます。

沿革と統計

メールの送信とHTTPリクエストの両方を対象としています。

方法 パス レベル 目的
GET /api/v1/history 読む リストの実行
GET /api/v1/history/:id 読む リクエストおよびレスポンスデータを含む1つの実行結果を取得します
GET /api/v1/stats 読む 合計数と成功率

Historyでは、page、limit(最大100)、actionType、status(PENDING、SUCCESS、FAILED、SKIPPED)、およびactionConfigIdを受け付け、単一のレイアウトまたはリクエストに絞り込むことができます。

SKIPPED これは、受信者全員が配信停止手続きを済ませていたマーケティングメールです。何も送信されておらず、上限も使用されておらず、成功率の算出対象にもなりません。

actionType EMAIL または HTTP_REQUEST のいずれかでなければなりません。認識されない値は拒否されるのではなく無視されるため、入力ミスがあってもエラーになるのではなく、すべての結果が返されます。

Statsでは、days(デフォルトは30、最大は365)を受け付けます。

ステータスコード

コード 意味
200 成功
201 作成日
400 リクエストの形式が不正であるか、検証に失敗しました。errorにはフィールド名を指定します。例:subject: required
401 APIキーが欠落している、形式が不正である、または無効化されている
403 キーは有効ですが、このエンドポイントに対してはレベルが低すぎます
404 見つかりませんでした、または別の店舗の商品です
405 このパスには不適切なメソッドです
409 レコードがまだ使用中であるため(ファイルの削除)、またはGitHubが接続されていないため(GitHubのバージョン)、処理が拒否されました。
429 レート制限あり - 詳細は以下をご覧ください
502 リクエストは実行されましたが、サードパーティのターゲットでエラーが発生しました

別の店舗に属するレコードが403ではなく404を返すため、APIではそのIDが他の場所に存在するかどうかの確認が一切行われません。

レート制限

2つの独立した予算で、いずれもキーごとです:

  • すべてのエンドポイントにおいて、60秒あたり300件のリクエストです。
  • さらに、1時間あたり60回の呼び出しを実行し、POST /api/v1/http-requests/:id/testをカバーします。

いずれかを超過すると、説明として「error」というエラーメッセージとともに429が返されます。実行予算は意図的に厳しく設定されています。支払いプロバイダーに対してリクエストを大量に送信し続ける暴走ループは、スクリプトの実行が遅くなるよりもはるかに深刻な障害となるからです。

予算はストアごとではなくキーごとに設定されるため、ある統合が別の統合の割り当てをすべて使い切ることはありません。