soysoyAPI

API リファレンス

パートナー用

自分が担当の取引を扱う API。できることと断られることは画面と同じ。

顧客の申し込みと公開の承認はない。顧客本人が顧客ページで行う。

使い方

接続先
https://staging.soysoy.app/api/partner/v1
送り方
Authorization: Bearer hm_partner_…
トークン
アカウントの「AI アシスタントと自動化」で作る。期限は 90 日
OpenAPI
https://staging.soysoy.app/api/partner/v1/openapi.json ・ トークン不要
MCP
https://staging.soysoy.app/mcp ・ 同じトークンで入る
BASE=https://staging.soysoy.app/api/partner/v1
TOKEN=hm_partner_…

curl -s "$BASE/me" -H "Authorization: Bearer $TOKEN"

目次

レスポンスの形とエラー

成功は JSON。作ったときは 201 と Location ヘッダ。断るときは次の形で、code で見分ける。入力の誤りは 422 invalid で、fields に項目ごとの理由のコード、details に人が読む 1 文が付く(下の「入力の誤りの理由」)。いまの状態でできない操作は 409 wrong-phase で、phase に取引の状態、next に代わりにすることが付く。トークンが使えなければ、どの操作も 401 unauthorized。

{
  "error": {
    "code": "invalid",
    "message": "入力を確認してください(fields を見てください)",
    "fields": {
      "slug": "taken"
    },
    "details": {
      "slug": "この URL の名前はほかのサイトで使われています。ほかの名前にしてください。"
    }
  }
}
  • 400bad-request

    リクエストの形が正しくありません

  • 401unauthorized

    トークンが使えません。ない、この API 用ではない、期限切れ、取り消し済みのどれかです

  • 403suspend-denied

    顧客が公開を承認したサイトは運営だけが非公開にできます。止めたいときは運営にご連絡ください

  • 404not-found

    見つかりません(ほかの人の取引にも同じように返します)

  • 409wrong-phase

    いまの状態ではこの操作はできません

  • 409bad-version

    この版は表示できません(アップロードが済んだ版を指定してください)

  • 409no-active-version

    先に表示する版を選んでください(activate)

  • 409unchanged

    修正の依頼のあとは、直した版をアップロードして表示する版に切り替えてから確認依頼を出してください

  • 409resume-denied

    このサイトは運営だけが公開に戻せます

  • 409already-uncounted

    この修正の依頼はもう回数に数えないことにしています

  • 413too-large

    zip の上限(30MB)を超えています

  • 422invalid

    入力を確認してください(fields を見てください)

  • 422zip

    zip を受け付けられません。理由は message にあります

  • 429rate-limited

    呼び出しが多すぎます。Retry-After の秒数だけ待ってからもう一度お試しください

  • 500internal

    こちらの不具合です。少し待ってからもう一度お試しください

入力の誤りの理由

422 invalid の fields に入るコード。同じ文が details に入る。

  • shopNamerequired

    店舗名がありません。shopName に 1〜60 文字で入れてください。

  • shopNameinvalid

    店舗名が長すぎます。60 文字までです。

  • slugrequired

    URL の名前がありません。slug に 3〜40 文字で入れてください。

  • sluglength

    URL の名前は 3〜40 文字です。

  • slugcharset

    URL の名前に使えるのは半角の英小文字、数字、ハイフンだけです。

  • slugedge-hyphen

    URL の名前の最初と最後にハイフンは使えません。

  • slugdouble-hyphen

    URL の名前にハイフンを 2 つ続けては使えません。プレビューのアドレスの区切りに使うためです。

  • slugreserved

    この URL の名前はサービスで使うので選べません。ほかの名前にしてください。

  • slugtaken

    この URL の名前はほかのサイトで使われています。ほかの名前にしてください。

  • sluglocked

    顧客が公開を承認したあとは URL の名前を変えられません。

  • kindinvalid

    業種は food、beauty、clinic、retail、school、other のどれかです。

  • kindlocked

    顧客がヒアリングに回答したあとは業種を変えられません。

  • kindclosed

    キャンセルや解約で終わった取引の業種は変えられません。

アカウント

このトークンの持ち主のメンバーを返す。

レスポンス

200
トークンの持ち主 Me

例

curl -s "$BASE/me" \
  -H "Authorization: Bearer $TOKEN"

取引

自分が担当の取引を更新の新しい順に 50 件ずつ返す。

パラメーター

  • phase

    クエリ・string

    状態で絞り込む。値: draft、proposed、applied、review、revising、approved、live、ended、canceled

  • q

    クエリ・string

    店舗名、受付番号(HM- はなくてもよい)、顧客の電話番号(数字だけで比べる)、メールアドレス、URL の名前、独自ドメインの一部で絞り込む

  • page

    クエリ・integer

    ページ。50 件ずつ。既定は 1

レスポンス

200
取引の一覧 DealList

例

curl -s "$BASE/deals" \
  -H "Authorization: Bearer $TOKEN"

取引の作成

POST/deals

取引を下書きで作る。顧客には何も届かない。料金は指定できない(月額 3,300 円、税込)。業種(kind)はヒアリングの回答が届くまで変えられる。

本文

JSON(Content-Type: application/json)

  • shopName

    string・必須

    店舗名。60 文字まで

  • slug

    string・必須

    サイトの URL の名前(https://<slug>.<配信ドメイン>)。半角の英小文字・数字・ハイフンで 3〜40 文字(大文字は小文字にする)。公開の承認までは変えられる(顧客がヒアリングで変えることもある)

  • kind

    string

    業種。food 飲食店、beauty 美容室・サロン、clinic 整体院・治療院、retail 物販のお店、school 教室・スクール、other そのほか。ヒアリングの質問と、顧客ページやメールでのお店の呼び方(院、教室)がこれに合わせて変わる。省くと other。既定は other

  • note

    string

    メモ。顧客には見えない。1,000 文字まで

レスポンス

201
作った取引 DealLocation 作った取引の API の URL(パス)
400
bad-request リクエストの形が正しくありません
422
invalid 入力を確認してください(fields を見てください)

例

curl -sX POST "$BASE/deals" \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"shopName":"鳥源","slug":"torigen","kind":"food"}'

取引の詳細

GET/deals/{id}

取引と、アップロードした版(プレビューの URL つき)、顧客の連絡先、取引の記録を返す。

パラメーター

  • id

    パス・string

    取引の ID

レスポンス

200
取引の詳細 DealDetail
404
not-found 見つかりません(ほかの人の取引にも同じように返します)

例

curl -s "$BASE/deals/$DEAL_ID" \
  -H "Authorization: Bearer $TOKEN"

取引の変更

PATCH/deals/{id}

送った項目だけを変える。slug は公開の承認のあとは変えられない(fields.slug が locked)。slug を変えると、ご提案のサイトのアドレスもすぐに変わり、前のアドレスでは開けなくなる。kind は顧客がヒアリングに回答したあとは変えられない(fields.kind が locked)。顧客には何も届かない。

パラメーター

  • id

    パス・string

    取引の ID

本文

JSON(Content-Type: application/json)

  • shopName

    string

    店舗名。60 文字まで

  • slug

    string

    サイトの URL の名前(https://<slug>.<配信ドメイン>)。半角の英小文字・数字・ハイフンで 3〜40 文字(大文字は小文字にする)。公開の承認までは変えられる(顧客がヒアリングで変えることもある)

  • kind

    string

    業種。food 飲食店、beauty 美容室・サロン、clinic 整体院・治療院、retail 物販のお店、school 教室・スクール、other そのほか。ヒアリングの質問と、顧客ページやメールでのお店の呼び方(院、教室)がこれに合わせて変わる。顧客がヒアリングに回答したあとは変えられない(fields.kind が locked)

  • note

    string

    メモ。顧客には見えない。1,000 文字まで

レスポンス

200
変えたあとの取引 Deal
400
bad-request リクエストの形が正しくありません
404
not-found 見つかりません(ほかの人の取引にも同じように返します)
422
invalid 入力を確認してください(fields を見てください)

例

curl -sX PATCH "$BASE/deals/$DEAL_ID" \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"shopName":"鳥源","slug":"torigen","kind":"food"}'

確認依頼

POST/deals/{id}/request-review

いま表示している版の確認を顧客に頼む。顧客に「ホームページが完成しました」のメールが届く。この版が、顧客が公開を承認する版になる。修正の依頼のあとは、直した版をアップロードして表示を切り替えてから呼ぶ。

パラメーター

  • id

    パス・string

    取引の ID

レスポンス

200
確認を頼んだ版{ reviewVersion: integer }
404
not-found 見つかりません(ほかの人の取引にも同じように返します)
409
no-active-version 先に表示する版を選んでください(activate)wrong-phase いまの状態ではこの操作はできませんunchanged 修正の依頼のあとは、直した版をアップロードして表示する版に切り替えてから確認依頼を出してください

例

curl -sX POST "$BASE/deals/$DEAL_ID/request-review" \
  -H "Authorization: Bearer $TOKEN"

キャンセル

POST/deals/{id}/cancel

公開前の取引をキャンセルする。取り消せない。サイトは見られなくなり、slug はほかの取引で使えるようになる。申し込み済みの顧客には、キャンセルのお知らせのメールが届く。

パラメーター

  • id

    パス・string

    取引の ID

レスポンス

200
キャンセルした{ phase: "canceled" }
404
not-found 見つかりません(ほかの人の取引にも同じように返します)
409
wrong-phase いまの状態ではこの操作はできません

例

curl -sX POST "$BASE/deals/$DEAL_ID/cancel" \
  -H "Authorization: Bearer $TOKEN"

リンクの再発行

POST/deals/{id}/rotate-token

顧客ページの URL を作り直す。古い URL はすぐに使えなくなる。キャンセルや解約で終わった取引はできない。顧客が申し込みで確認済みのメールアドレスがあれば、新しい URL をそこへメールで送る(`mailed`)。なければ新しい URL を顧客に送るのは呼ぶ側の仕事。

パラメーター

  • id

    パス・string

    取引の ID

レスポンス

200
新しい顧客ページの URL{ customerUrl: string, mailed: boolean }
404
not-found 見つかりません(ほかの人の取引にも同じように返します)
409
wrong-phase いまの状態ではこの操作はできません

例

curl -sX POST "$BASE/deals/$DEAL_ID/rotate-token" \
  -H "Authorization: Bearer $TOKEN"

非公開にする

POST/deals/{id}/suspend

ご提案のサイトをすぐに見られなくする。顧客が公開を承認したあとのサイトは運営だけが止められる(403 suspend-denied)。顧客にメールは届かない。

パラメーター

  • id

    パス・string

    取引の ID

レスポンス

200
非公開かどうか{ suspended: boolean }
403
suspend-denied 顧客が公開を承認したサイトは運営だけが非公開にできます。止めたいときは運営にご連絡ください
404
not-found 見つかりません(ほかの人の取引にも同じように返します)
409
resume-denied このサイトは運営だけが公開に戻せます

例

curl -sX POST "$BASE/deals/$DEAL_ID/suspend" \
  -H "Authorization: Bearer $TOKEN"

非公開をやめる

POST/deals/{id}/resume

自分が非公開にしたサイトを戻す。運営が止めたサイトと、キャンセルと解約で止まったサイトは戻せない(resume-denied)。

パラメーター

  • id

    パス・string

    取引の ID

レスポンス

200
非公開かどうか{ suspended: boolean }
403
suspend-denied 顧客が公開を承認したサイトは運営だけが非公開にできます。止めたいときは運営にご連絡ください
404
not-found 見つかりません(ほかの人の取引にも同じように返します)
409
resume-denied このサイトは運営だけが公開に戻せます

例

curl -sX POST "$BASE/deals/$DEAL_ID/resume" \
  -H "Authorization: Bearer $TOKEN"

再契約

POST/deals/{id}/recontract

解約で終わった取引から、同じ URL の新しい取引を下書きで作る(1 回だけ)。前のサイトの最後の版を v1 に写す。siteCopy が copied でなければ zip をアップロードする。

パラメーター

  • id

    パス・string

    取引の ID

レスポンス

201
新しい取引{ id: string, siteCopy: "copied" | "nothing" | "failed" }Location 作った取引の API の URL(パス)
404
not-found 見つかりません(ほかの人の取引にも同じように返します)
409
wrong-phase いまの状態ではこの操作はできません

例

curl -sX POST "$BASE/deals/$DEAL_ID/recontract" \
  -H "Authorization: Bearer $TOKEN"

サイト

zip のアップロード

POST/deals/{id}/versions

サイトの zip を新しい版としてアップロードする。本文は zip そのもの。いちばん上に index.html が要る。ファイル名に使えるのは半角の英数字と . _ - ( ) + @ と空白だけ。zip は 30MB、500 ファイル、1 ファイル 15MB、展開後の合計 100MB まで。下書きの取引では、この版がそのまま表示する版になり、顧客ページができる(shown が true、customerUrl が入る。issue は要らない)。顧客にメールは届かない。そのほかの取引では表示は変わらない(activate で切り替える)。

パラメーター

  • id

    パス・string

    取引の ID

  • name

    クエリ・string

    版の一覧に出すファイル名。200 文字まで。既定は site.zip

本文

ファイルそのもの(Content-Type: application/zip)

レスポンス

201
新しい版 Uploaded
400
bad-request リクエストの形が正しくありません
404
not-found 見つかりません(ほかの人の取引にも同じように返します)
409
wrong-phase いまの状態ではこの操作はできません
413
too-large zip の上限(30MB)を超えています
422
zip zip を受け付けられません。理由は message にあります

例

curl -sX POST "$BASE/deals/$DEAL_ID/versions?name=site.zip" \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/zip' \
  --data-binary @site.zip

表示する版の切り替え

POST/deals/{id}/activate

アップロードした版をサイトの URL で見える版にする。すぐに切り替わる。公開前はご提案のサイトが、公開中は公開中のサイトが変わる。顧客にメールは届かない(確認を頼むのは request-review)。

パラメーター

  • id

    パス・string

    取引の ID

本文

JSON(Content-Type: application/json)

  • version

    integer・必須

    表示する版の番号(v1 なら 1)

レスポンス

200
表示している版{ activeVersion: integer }
400
bad-request リクエストの形が正しくありません
404
not-found 見つかりません(ほかの人の取引にも同じように返します)
409
bad-version この版は表示できません(アップロードが済んだ版を指定してください)wrong-phase いまの状態ではこの操作はできません

例

curl -sX POST "$BASE/deals/$DEAL_ID/activate" \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"version":2}'

ヒアリング

ヒアリングの回答

GET/deals/{id}/hearing

顧客の回答を新しい順に返す(修正の依頼も含む)。設問は回答したときの形で、取引の業種の言葉になっている。写真は URL つきで、中身は files で取り出す。

パラメーター

  • id

    パス・string

    取引の ID

レスポンス

200
回答 Hearing
404
not-found 見つかりません(ほかの人の取引にも同じように返します)

例

curl -s "$BASE/deals/$DEAL_ID/hearing" \
  -H "Authorization: Bearer $TOKEN"

修正の依頼を回数に数えない

POST/deals/{id}/revisions/{responseId}/uncount

ヒアリングの回答どおりになっていなかったなど、担当のまちがいを直す修正の依頼を、顧客の回数に数えないことにする。顧客ページの残りの回数が 1 回戻る。1 つの依頼に 1 回だけで、元に戻せない。顧客が公開を承認する前(review、revising)だけ。取引のログに残る。

パラメーター

  • id

    パス・string

    取引の ID

  • responseId

    パス・string

    修正の依頼の ID(getHearing の responses[].id。round が 1 以上のもの)

レスポンス

200
回数に数えないことにした依頼の通し番号{ round: integer }
404
not-found 見つかりません(ほかの人の取引にも同じように返します)
409
wrong-phase いまの状態ではこの操作はできませんalready-uncounted この修正の依頼はもう回数に数えないことにしています

例

curl -sX POST "$BASE/deals/$DEAL_ID/revisions/{responseId}/uncount" \
  -H "Authorization: Bearer $TOKEN"

ヒアリングの写真

GET/deals/{id}/files/{fileId}

顧客が送った写真そのもの。Content-Type は写真の形式(image/jpeg、image/png、image/gif、image/webp、image/heic)。

パラメーター

  • id

    パス・string

    取引の ID

  • fileId

    パス・string

    写真の ID(ヒアリングの回答の photos[].id)

レスポンス

200
写真(image/*)
404
not-found 見つかりません(ほかの人の取引にも同じように返します)

例

curl -s "$BASE/deals/$DEAL_ID/files/$FILE_ID" \
  -H "Authorization: Bearer $TOKEN" \
  -o photo.jpg

公開のあと

顧客に Google ビジネスプロフィールの「ウェブサイト」に URL を入れてもらったことを記録する(済にする)。公開中の取引だけ。

パラメーター

  • id

    パス・string

    取引の ID

レスポンス

200
済にした作業{ done: "gbp" }
404
not-found 見つかりません(ほかの人の取引にも同じように返します)
409
wrong-phase いまの状態ではこの操作はできません

例

curl -sX POST "$BASE/deals/$DEAL_ID/followup/gbp" \
  -H "Authorization: Bearer $TOKEN"

型

日時は UTC のミリ秒。

  • id

    string

  • name

    string

  • email

    string

  • role

    "partner" | "admin"

    役割。partner パートナー、admin 管理者

  • deals

    Deal[]

  • deals[].staffName

    string

    担当の名前

  • total

    integer

    条件に合う取引の数

  • page

    integer

  • pages

    integer

  • id

    string

    取引の ID

  • refCode

    string

    受付番号。顧客とのやりとりで使う

  • shopName

    string

    店舗名

  • kind

    string

    業種。food 飲食店、beauty 美容室・サロン、clinic 整体院・治療院、retail 物販のお店、school 教室・スクール、other そのほか。ヒアリングの質問と、顧客ページやメールでのお店の呼び方(院、教室)がこれに合わせて変わる

  • phase

    string

    取引の状態。draft 下書き、proposed 顧客に提案中、applied 申し込み済み(ヒアリング)、review 顧客の確認待ち、revising 修正の依頼を受けた、approved 公開の承認済みで初回の支払い待ち、live 公開中、ended 解約で終わった、canceled キャンセル

  • planId

    string

    プランの ID

  • priceMonthly

    integer

    月額(円、税込)。作ったときの金額で、いまは 3,300 円

  • note

    string

    メモ。顧客には見えない

  • staffId

    string

    担当のメンバーの ID

  • reviewVersion

    integer | null

    確認依頼を出した版。顧客が公開を承認するのはこの版

  • customerUrl

    string | null

    顧客ページの URL。下書きのあいだは null(最初の zip をアップロードすると入る)。顧客に送るのは人の仕事

  • site

    object

  • site.slug

    string

    サイトの URL の名前

  • site.url

    string

    サイトの URL(独自ドメインがあればそちら)

  • site.status

    "demo" | "live" | "suspended"

    demo ご提案のサイト(検索よけつき)、live 公開中、suspended 非公開

  • site.activeVersion

    integer | null

    いま表示している版

  • site.customDomain

    string | null

    独自ドメイン

  • views

    object

    顧客ページが開かれた回数と日時

  • views.count

    integer

  • views.first

    string | null

    日時(ISO 8601、UTC)。まだなら null

  • views.last

    string | null

    日時(ISO 8601、UTC)。まだなら null

  • followup

    object

    公開のあとの作業を済にした日時(Search Console、Google ビジネスプロフィール)

  • followup.indexRequestedAt

    string | null

    日時(ISO 8601、UTC)。まだなら null

  • followup.gbpGuidedAt

    string | null

    日時(ISO 8601、UTC)。まだなら null

  • times

    object

  • times.createdAt

    string

    日時(ISO 8601、UTC)

  • times.updatedAt

    string

    日時(ISO 8601、UTC)

  • times.proposedAt

    string | null

    日時(ISO 8601、UTC)。まだなら null

  • times.appliedAt

    string | null

    日時(ISO 8601、UTC)。まだなら null

  • times.reviewRequestedAt

    string | null

    日時(ISO 8601、UTC)。まだなら null

  • times.approvedAt

    string | null

    日時(ISO 8601、UTC)。まだなら null

  • times.liveAt

    string | null

    日時(ISO 8601、UTC)。まだなら null

  • times.canceledAt

    string | null

    日時(ISO 8601、UTC)。まだなら null

  • times.endedAt

    string | null

    日時(ISO 8601、UTC)。まだなら null

  • times.erasedAt

    string | null

    日時(ISO 8601、UTC)。まだなら null

DealDetail

Deal の項目と、次の項目

  • versions

    Version[]

    アップロードした版。新しい順

  • customer

    object | null

    顧客の連絡先。申し込みの前は null

  • customer.name

    string

  • customer.email

    string

  • customer.phone

    string

  • customer.cardRegistered

    boolean

    顧客がカードを登録したか

  • customer.card

    object | null

    登録したカード。管理用の接続先だけが返す

  • customer.card.brand

    string | null

  • customer.card.last4

    string

  • log

    object[]

    取引の記録。新しい 50 件

  • log[].type

    string

  • log[].actor

    string

  • log[].at

    string

    日時(ISO 8601、UTC)

  • version

    integer

    版の番号(v1 なら 1)

  • status

    "uploading" | "ready" | "failed"

    uploading 処理中、ready 使える、failed 失敗

  • fileCount

    integer

  • totalBytes

    integer

  • skipped

    string[]

    読み飛ばしたファイル(__MACOSX、Thumbs.db、. で始まるもの)

  • createdAt

    string

    日時(ISO 8601、UTC)

  • previewUrl

    string | null

    この版のプレビューの URL(ready のときだけ)

  • version

    integer

    新しい版の番号

  • fileCount

    integer

  • skipped

    string[]

    読み飛ばしたファイル

  • shown

    boolean

    この版が表示する版になったか。下書きの取引の最初の版は true で、顧客ページもできる

  • customerUrl

    string | null

    顧客ページの URL(取引の customerUrl と同じ)

  • responses

    object[]

  • responses[].id

    string

  • responses[].createdAt

    string

    日時(ISO 8601、UTC)

  • responses[].round

    integer

    0 はヒアリングの回答。1 から先は修正の依頼の通し番号

  • responses[].counted

    boolean

    修正の依頼が顧客の回数(公開の前に 2 回)に数えられているか。uncountRevision で false にできる。ヒアリングの回答は false

  • responses[].formVersion

    string

    設問の版。ヒアリングは末尾が業種

  • responses[].answers

    object[]

  • responses[].answers[].id

    string

  • responses[].answers[].section

    string

  • responses[].answers[].label

    string

    設問

  • responses[].answers[].value

    string[]

    回答(選んだ選択肢の名前、入力した文)。写真のほかの設問

  • responses[].answers[].photos

    object[]

    送った写真。写真の設問

  • responses[].answers[].photos[].id

    string

  • responses[].answers[].photos[].name

    string

    顧客の端末でのファイル名

  • responses[].answers[].photos[].contentType

    string

  • responses[].answers[].photos[].size

    integer

    バイト数

  • responses[].answers[].photos[].url

    string

    写真そのものの URL(同じトークンで GET する)