Companify API v1

Companify API は、会社法人の設立と、その後の運営に必要な最低限のバックオフィス業務を、プログラムから扱うための API です。対象は Companify 本体と同じで、会社 1 件を Company Document(JSON)として出し入れします。

現在提供しているのは設立の範囲(会社の情報、設立登記の書類の生成と確定状態、設立後の届出)です。 会社の運営に関わる操作は、同じ Company Document と同じ認証のもとで順次追加します。 ベース URL は https://companify.app/api/v1。応答はすべて JSON で、PDF を返すエンドポイントだけ application/pdf です。アルファ版のため、形式は予告のうえで変更することがあります。

認証

API キーを Authorization: Bearer <key> ヘッダで送ります。キーはログイン後の アカウント設定 で自分で作成し、同じ画面で失効できます。キーの値が表示されるのは作成時の 1 回だけです。

curl https://companify.app/api/v1/me \
  -H "Authorization: Bearer <key>"

キーはユーザに紐づきます。操作できるのは、そのユーザが社員になっている会社だけです(Web と同じ範囲)。 利用者が作成するキーにはスコープが付かず、そのユーザができる操作はすべて行えます。 スコープ(company:read, company:write, document:generate, document:confirm, filing:write)が付いたキーでは、付いていない操作が 403 になります。

書類の確定を含め、Web でできる操作は API からも行えます。確定は入力内容のハッシュを記録する操作なので、 先に PDF か Company Document の内容を確認してから呼んでください。API キー経由の書き込みはすべて操作履歴(events)に記録されます。

認証なしで使えるのは、リクエスト本文から PDF を生成する POST /documents/{type}、入力が揃っているかを検査する POST /validate、それに GET /openapi.json です。

Company Document

会社 1 件を、この 1 つの JSON で表します。GET /companies/{id} がこの形式で返します。下書きと同じく空の値を許すので、入力の途中でも保存できます。 書類を生成できる状態かどうかは /check と /validate が判定します。

{
  "$schema": "https://companify.app/schema/company.v1.json",
  "company": {
    "tradeName": "合同会社サンプル",
    "tradeNameKana": "ゴウドウガイシャサンプル",
    "tradeNameRoman": "Sample LLC",
    "businessPurposes": ["ソフトウェアの企画、開発及び販売", "前各号に附帯又は関連する一切の事業"],
    "headOfficeAddress": { "postalCode": "150-0001", "prefecture": "東京都", "city": "渋谷区", "street": "神宮前1-1-1", "building": "" },
    "capitalAmount": 1000000,
    "fiscalYearStartMonth": 4,
    "plannedIncorporationDate": "2026-10-15",
    "articlesDate": "2026-10-01"
  },
  "members": [
    {
      "familyName": "山田", "givenName": "太郎", "familyNameKana": "ヤマダ", "givenNameKana": "タロウ",
      "address": { "postalCode": "150-0001", "prefecture": "東京都", "city": "渋谷区", "street": "神宮前1-1-1" },
      "investmentAmount": 1000000, "isManagingMember": true, "isRepresentative": true,
      "paidAmount": 1000000, "paidAt": "2026-10-02"
    }
  ],
  "teikanOptions": {
    "publicNotice": { "kind": "official_gazette" },
    "representativeSelection": { "kind": "mutual_election" },
    "memberChangeRule": "unanimous",
    "profitDistribution": { "kind": "by_investment" },
    "inheritanceSuccession": true,
    "managingMemberTerm": { "kind": "none" },
    "managingMemberCompensation": "not_specified",
    "executionDecisionMethod": "majority",
    "includeAmendmentDissolutionChapter": true
  },
  "filingAnswers": { "paysSalary": "yes", "under10Payees": "yes", "hiresEmployees": "no", "businessCustomers": "unknown" },
  "confirmations": [ { "documentType": "teikan", "sourceHash": "3f2a…", "confirmedAt": "2026-10-01T09:00:00.000Z" } ],
  "meta": { "id": "clx…", "status": "incorporating", "corporateNumber": null, "incorporatedAt": "2026-10-15", "updatedAt": "2026-10-16T01:23:45.000Z" }
}
項目書き込み内容と制約
company可商号は 200 文字以内で、先頭か末尾に「合同会社」が必要です。フリガナは全角カタカナ。事業目的は 1 件 500 文字以内で 50 件まで。資本金は円単位の整数。日付は YYYY-MM-DD 形式で、令和以降の実在する日付です
members可1〜50 名。代表社員が 1 名以上必要で、代表社員は業務執行社員でもある必要があります。paidAmount / paidAt は未払込なら null。内部の id は含まれず、配列の並び順で同定します
teikanOptions可定款の任意規定です。すべて既定値でも、取得時には展開した形で返します
filingAnswers可設立後の届出に関する問診の答えです。各項目は yes / no / unknown。未回答の項目はキーごと省きます
confirmations不可確定済みの書類と、確定した時点の入力の SHA-256 です。送信しても無視されます
meta不可id、status(planning / incorporating / active)、法人番号、設立日、更新日時です。送信しても無視されます

JSON Schema は /schema/company.v1.json にあります。商号の位置や代表社員の条件のように Schema で表せない規則はサーバが検査します。Schema は緩めに定義し、サーバの判定を正とします。

エンドポイント

メソッドとパス概要必要なスコープ
GET/me自分の情報と、操作できる会社の一覧company:read
GET/companies会社の一覧company:read
GET/companies/{id}会社を Company Document 形式で取得(エクスポート)company:read
GET/companies/{id}/check入力の不足・書類の確定状態・進捗company:read
GET/companies/{id}/filings設立後の届出の一覧と期日・提出状況company:read
GET/companies/{id}/events操作履歴の取得company:read
POST/companies/{id}/documents/{type}保存済みの会社から PDF を生成document:generate
POST/companies/{id}/documents/{type}/confirm書類を確定document:confirm
POST/documents/{type}リクエスト本文から PDF を生成(認証不要)認証不要
POST/validateCompany Document の入力が揃っているかを検査(認証不要)認証不要
GET/openapi.jsonOpenAPI 3.1 の定義認証不要

GET/me

自分の情報と、操作できる会社の一覧

API キーの持ち主の情報と、その人が社員になっている会社の一覧を返します。`scopes` はこのキーで許可されている操作です。スコープの無いキーではすべての操作が並びます。

必要なスコープ: company:read

応答

200自分の情報と会社の一覧
401認証が必要です。キーが無いか、失効しています
403このキーのスコープでは許可されていない操作です

GET/companies

会社の一覧

自分が社員になっている会社を、作成が新しい順に返します。会社の内容は `GET /companies/{id}` で取得します。

必要なスコープ: company:read

応答

200会社の一覧
401認証が必要です。キーが無いか、失効しています
403このキーのスコープでは許可されていない操作です

GET/companies/{id}

会社を Company Document 形式で取得(エクスポート)

会社・社員・定款オプション・届出の問診の答えに、読み取り専用の `confirmations`(書類の確定記録)と `meta`(id や状態)を添えて返します。

必要なスコープ: company:read

パラメータ

idパス・必須会社の id。`GET /companies` または `GET /me` で取得できます

応答

200Company Document
401認証が必要です。キーが無いか、失効しています
403このキーのスコープでは許可されていない操作です
404会社・届出・書類の種別が見つかりません。他人の会社もこの応答になります

GET/companies/{id}/check

入力の不足・書類の確定状態・進捗

書類を生成できる状態か(`complete` と不足している項目)、定款・決定書・就任承諾書の確定が有効か、次に進む段階を返します。画面のダッシュボードと同じ判定です。

必要なスコープ: company:read

パラメータ

idパス・必須会社の id。`GET /companies` または `GET /me` で取得できます

応答

200判定の結果
401認証が必要です。キーが無いか、失効しています
403このキーのスコープでは許可されていない操作です
404会社・届出・書類の種別が見つかりません。他人の会社もこの応答になります

GET/companies/{id}/filings

設立後の届出の一覧と期日・提出状況

問診の答えと、この会社に必要な届出の一覧を返します。`dueDate` は設立日から計算できるものだけに入り、自治体ごとに異なるものは null です。設立日が未記録ならすべて null になります。

必要なスコープ: company:read

パラメータ

idパス・必須会社の id。`GET /companies` または `GET /me` で取得できます

応答

200届出の一覧
401認証が必要です。キーが無いか、失効しています
403このキーのスコープでは許可されていない操作です
404会社・届出・書類の種別が見つかりません。他人の会社もこの応答になります

GET/companies/{id}/events

操作履歴の取得

新しい順に返します。`nextCursor` が返ったら `?cursor=` に渡すと続きを取得できます。`payload` に氏名や住所は含まれません。

必要なスコープ: company:read

パラメータ

idパス・必須会社の id。`GET /companies` または `GET /me` で取得できます
cursorクエリ前の応答で返った `nextCursor`
typeクエリイベントの種別で絞り込みます(例: `company.updated`)
limitクエリ1 回に返す件数。1〜200、省略時は 50

応答

200操作履歴
401認証が必要です。キーが無いか、失効しています
403このキーのスコープでは許可されていない操作です
404会社・届出・書類の種別が見つかりません。他人の会社もこの応答になります

POST/companies/{id}/documents/{type}

保存済みの会社から PDF を生成

リクエスト本文は不要です。入力が揃っていなければ 400 と不足している項目を返します。生成すると操作履歴に `document.generated` が残ります。`?preview=1` を付けない場合は、先に定款作成日が確定している必要があります。

必要なスコープ: document:generate

パラメータ

idパス・必須会社の id。`GET /companies` または `GET /me` で取得できます
typeパス・必須書類の種別。teikan = 定款、kettei = 決定書、shunin = 就任承諾書、haraikomi = 払込証明書
previewクエリ`1` を指定するとプレビューになります。定款作成日が未確定でも当日の日付で生成し、ファイル名に「プレビュー」が付きます

応答

200PDF(application/pdf)
400リクエスト本文の形式が正しくないか、入力が揃っていません
401認証が必要です。キーが無いか、失効しています
403このキーのスコープでは許可されていない操作です
404会社・届出・書類の種別が見つかりません。他人の会社もこの応答になります

POST/companies/{id}/documents/{type}/confirm

書類を確定

いまの入力内容のハッシュを記録して、その書類を確定します。先に `?preview=1` で PDF を、または Company Document を確認してから呼んでください。確定後に入力を変えると確定は失効します(`/check` の `stale`)。定款を初めて確定するときは `articlesDate`(定款作成日)を渡します。決定書と就任承諾書は定款の確定後にしか確定できません。

必要なスコープ: document:confirm

パラメータ

idパス・必須会社の id。`GET /companies` または `GET /me` で取得できます
typeパス・必須確定する書類。teikan = 定款、kettei = 決定書、shunin = 就任承諾書

リクエスト本文

定款を初めて確定するときの定款作成日(YYYY-MM-DD)。省略可(application/json)

応答

200確定した
400前提を満たしていない(入力が揃っていない、定款が未確定、日付が不正)。detail に理由
401認証が必要です。キーが無いか、失効しています
403このキーのスコープでは許可されていない操作です
404会社・届出・書類の種別が見つかりません。他人の会社もこの応答になります

POST/documents/{type}

リクエスト本文から PDF を生成(認証不要)

サーバに保存されている情報は使いません。リクエスト本文は Company Document の `company` / `members` / `teikanOptions` で、64KB まで、`Content-Type: application/json` が必須です。失敗時は理由をテキスト(text/plain)で返します。このエンドポイントだけ problem+json ではないのは、登録前の下書きプレビューと互換にするためです。

認証不要

パラメータ

typeパス・必須書類の種別。teikan = 定款、kettei = 決定書、shunin = 就任承諾書、haraikomi = 払込証明書
previewクエリ`1` を指定するとプレビューになります。定款作成日が未確定でも当日の日付で生成し、ファイル名に「プレビュー」が付きます

リクエスト本文

生成に必要な値(application/json)

応答

200PDF(application/pdf)
400リクエスト本文の形式が正しくないか、入力が揃っていません(text/plain)
404書類の種別が見つかりません
413リクエスト本文が 64KB を超えています
415Content-Type が application/json ではありません

POST/validate

Company Document の入力が揃っているかを検査(認証不要)

サーバに保存されている情報は使いません。書類を生成できる状態かと、不足している項目を返します。

認証不要

リクエスト本文

Company Document(application/json)

応答

200判定の結果
400リクエスト本文の形式が正しくないか、入力が揃っていません
413リクエスト本文が 64KB を超えています
415Content-Type が application/json ではありません

GET/openapi.json

OpenAPI 3.1 の定義

この API の機械可読な定義です。リファレンス `/docs/api` はこの定義から生成しています。

認証不要

応答

200OpenAPI 3.1 の JSON

エラー

失敗はすべて application/problem+json(RFC 9457)で返します。 入力した値(氏名・住所・商号)はエラー応答にもログにも含めません。type はこのページの該当行へのリンクです。

{
  "type": "https://companify.app/docs/api#error-incomplete",
  "title": "入力が揃っていません",
  "status": 400,
  "detail": "書類を生成するには、不足している項目の入力が必要です",
  "errors": [
    { "path": "company.tradeNameKana", "message": "必須" },
    { "path": "members.1.address.postalCode", "message": "郵便番号は 123-4567 形式" }
  ]
}
状態コードtype の末尾発生する場面
400invalid-bodyリクエスト本文が JSON でない、または型や上限が合いません。errors[] に該当する項目が入ります
400incomplete入力が揃っておらず、書類を生成できません。errors[] に不足している項目が入ります
400articles-date-requiredプレビュー以外で、定款作成日が未確定です
400render-failedこの入力の組み合わせでは生成できません(払込が未記録など)
400invalid-cursor操作履歴の cursor が正しくありません
401unauthenticatedAPI キーが無い、失効している、または期限切れです
403forbiddenこのキーのスコープでは許可されていない操作です。detail に必要なスコープが入ります
404not-found会社・届出・書類の種別が見つかりません。他人の会社も 404 になります(存在を明かしません)
413too-largeリクエスト本文が 64KB を超えています
415unsupported-media-typeContent-Type が application/json ではありません
500internal想定外の失敗です。詳細は返しません

呼び出し回数の上限は WAF で設けています。上限を超えると 429 が返ります(この応答だけは problem+json ではありません)。