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 です。
会社 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/validate | Company Document の入力が揃っているかを検査(認証不要) | 認証不要 |
| GET/openapi.json | OpenAPI 3.1 の定義 | 認証不要 |
自分の情報と、操作できる会社の一覧
API キーの持ち主の情報と、その人が社員になっている会社の一覧を返します。`scopes` はこのキーで許可されている操作です。スコープの無いキーではすべての操作が並びます。
必要なスコープ: company:read
| 200 | 自分の情報と会社の一覧 |
| 401 | 認証が必要です。キーが無いか、失効しています |
| 403 | このキーのスコープでは許可されていない操作です |
会社の一覧
自分が社員になっている会社を、作成が新しい順に返します。会社の内容は `GET /companies/{id}` で取得します。
必要なスコープ: company:read
| 200 | 会社の一覧 |
| 401 | 認証が必要です。キーが無いか、失効しています |
| 403 | このキーのスコープでは許可されていない操作です |
会社を Company Document 形式で取得(エクスポート)
会社・社員・定款オプション・届出の問診の答えに、読み取り専用の `confirmations`(書類の確定記録)と `meta`(id や状態)を添えて返します。
必要なスコープ: company:read
id | パス・必須 | 会社の id。`GET /companies` または `GET /me` で取得できます |
| 200 | Company Document |
| 401 | 認証が必要です。キーが無いか、失効しています |
| 403 | このキーのスコープでは許可されていない操作です |
| 404 | 会社・届出・書類の種別が見つかりません。他人の会社もこの応答になります |
入力の不足・書類の確定状態・進捗
書類を生成できる状態か(`complete` と不足している項目)、定款・決定書・就任承諾書の確定が有効か、次に進む段階を返します。画面のダッシュボードと同じ判定です。
必要なスコープ: company:read
id | パス・必須 | 会社の id。`GET /companies` または `GET /me` で取得できます |
| 200 | 判定の結果 |
| 401 | 認証が必要です。キーが無いか、失効しています |
| 403 | このキーのスコープでは許可されていない操作です |
| 404 | 会社・届出・書類の種別が見つかりません。他人の会社もこの応答になります |
設立後の届出の一覧と期日・提出状況
問診の答えと、この会社に必要な届出の一覧を返します。`dueDate` は設立日から計算できるものだけに入り、自治体ごとに異なるものは null です。設立日が未記録ならすべて null になります。
必要なスコープ: company:read
id | パス・必須 | 会社の id。`GET /companies` または `GET /me` で取得できます |
| 200 | 届出の一覧 |
| 401 | 認証が必要です。キーが無いか、失効しています |
| 403 | このキーのスコープでは許可されていない操作です |
| 404 | 会社・届出・書類の種別が見つかりません。他人の会社もこの応答になります |
操作履歴の取得
新しい順に返します。`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 | 会社・届出・書類の種別が見つかりません。他人の会社もこの応答になります |
保存済みの会社から PDF を生成
リクエスト本文は不要です。入力が揃っていなければ 400 と不足している項目を返します。生成すると操作履歴に `document.generated` が残ります。`?preview=1` を付けない場合は、先に定款作成日が確定している必要があります。
必要なスコープ: document:generate
id | パス・必須 | 会社の id。`GET /companies` または `GET /me` で取得できます |
type | パス・必須 | 書類の種別。teikan = 定款、kettei = 決定書、shunin = 就任承諾書、haraikomi = 払込証明書 |
preview | クエリ | `1` を指定するとプレビューになります。定款作成日が未確定でも当日の日付で生成し、ファイル名に「プレビュー」が付きます |
| 200 | PDF(application/pdf) |
| 400 | リクエスト本文の形式が正しくないか、入力が揃っていません |
| 401 | 認証が必要です。キーが無いか、失効しています |
| 403 | このキーのスコープでは許可されていない操作です |
| 404 | 会社・届出・書類の種別が見つかりません。他人の会社もこの応答になります |
書類を確定
いまの入力内容のハッシュを記録して、その書類を確定します。先に `?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 | 会社・届出・書類の種別が見つかりません。他人の会社もこの応答になります |
リクエスト本文から PDF を生成(認証不要)
サーバに保存されている情報は使いません。リクエスト本文は Company Document の `company` / `members` / `teikanOptions` で、64KB まで、`Content-Type: application/json` が必須です。失敗時は理由をテキスト(text/plain)で返します。このエンドポイントだけ problem+json ではないのは、登録前の下書きプレビューと互換にするためです。
認証不要
type | パス・必須 | 書類の種別。teikan = 定款、kettei = 決定書、shunin = 就任承諾書、haraikomi = 払込証明書 |
preview | クエリ | `1` を指定するとプレビューになります。定款作成日が未確定でも当日の日付で生成し、ファイル名に「プレビュー」が付きます |
生成に必要な値(application/json)
| 200 | PDF(application/pdf) |
| 400 | リクエスト本文の形式が正しくないか、入力が揃っていません(text/plain) |
| 404 | 書類の種別が見つかりません |
| 413 | リクエスト本文が 64KB を超えています |
| 415 | Content-Type が application/json ではありません |
Company Document の入力が揃っているかを検査(認証不要)
サーバに保存されている情報は使いません。書類を生成できる状態かと、不足している項目を返します。
認証不要
Company Document(application/json)
| 200 | 判定の結果 |
| 400 | リクエスト本文の形式が正しくないか、入力が揃っていません |
| 413 | リクエスト本文が 64KB を超えています |
| 415 | Content-Type が application/json ではありません |
OpenAPI 3.1 の定義
この API の機械可読な定義です。リファレンス `/docs/api` はこの定義から生成しています。
認証不要
| 200 | OpenAPI 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 の末尾 | 発生する場面 |
|---|---|---|
| 400 | invalid-body | リクエスト本文が JSON でない、または型や上限が合いません。errors[] に該当する項目が入ります |
| 400 | incomplete | 入力が揃っておらず、書類を生成できません。errors[] に不足している項目が入ります |
| 400 | articles-date-required | プレビュー以外で、定款作成日が未確定です |
| 400 | render-failed | この入力の組み合わせでは生成できません(払込が未記録など) |
| 400 | invalid-cursor | 操作履歴の cursor が正しくありません |
| 401 | unauthenticated | API キーが無い、失効している、または期限切れです |
| 403 | forbidden | このキーのスコープでは許可されていない操作です。detail に必要なスコープが入ります |
| 404 | not-found | 会社・届出・書類の種別が見つかりません。他人の会社も 404 になります(存在を明かしません) |
| 413 | too-large | リクエスト本文が 64KB を超えています |
| 415 | unsupported-media-type | Content-Type が application/json ではありません |
| 500 | internal | 想定外の失敗です。詳細は返しません |
呼び出し回数の上限は WAF で設けています。上限を超えると 429 が返ります(この応答だけは problem+json ではありません)。