[{"data":1,"prerenderedAt":220},["ShallowReactive",2],{"$f1j3t42cewmwef":3},{"endpoints":4,"bodies":32,"fieldGroups":45,"responses":162,"errors":173},[5,12,19,26],{"id":6,"method":7,"path":8,"summary":9,"note":10,"curl":11},"get-resume","GET","\u002Fapi\u002Fv1\u002Fresume","下書きと公開状態を取得する","未保存なら空の内容と updatedAt: null が返ります。呼んでも経歴書は作られません。","curl \\\n  -H \"Authorization: Bearer $KEIREC_API_KEY\" \\\n  https:\u002F\u002Fkeirec.com\u002Fapi\u002Fv1\u002Fresume",{"id":13,"method":14,"path":15,"summary":16,"note":17,"curl":18},"put-draft","PUT","\u002Fapi\u002Fv1\u002Fresume\u002Fdraft","下書きを保存する","body は ResumeContent 全体です。部分更新はありません。公開中の内容には影響しません。","curl -X PUT \\\n  -H \"Authorization: Bearer $KEIREC_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d @resume.json \\\n  https:\u002F\u002Fkeirec.com\u002Fapi\u002Fv1\u002Fresume\u002Fdraft",{"id":20,"method":21,"path":22,"summary":23,"note":24,"curl":25},"post-publish","POST","\u002Fapi\u002Fv1\u002Fresume\u002Fpublish","下書きを公開する","初回の公開で公開URLが決まります。以後は非公開にしても同じURLに戻せます。","curl -X POST \\\n  -H \"Authorization: Bearer $KEIREC_API_KEY\" \\\n  https:\u002F\u002Fkeirec.com\u002Fapi\u002Fv1\u002Fresume\u002Fpublish",{"id":27,"method":21,"path":28,"summary":29,"note":30,"curl":31},"post-unpublish","\u002Fapi\u002Fv1\u002Fresume\u002Funpublish","公開を取り下げる","公開URLは即座に404になります。","curl -X POST \\\n  -H \"Authorization: Bearer $KEIREC_API_KEY\" \\\n  https:\u002F\u002Fkeirec.com\u002Fapi\u002Fv1\u002Fresume\u002Funpublish",[33,39],{"id":34,"title":35,"description":36,"json":37,"lines":38},"minimal","最小構成","これが受け付けられる最小の形です。`version` と `basic` と `sections` は省略できません(空でも入れます)。標準セクション(職務経歴・スキル・資格)は中身が空でよく、空のセクションは公開ページに出ません。","{\n  \"version\": 1,\n  \"basic\": {\n    \"name\": \"山田 太郎\",\n    \"title\": \"ソフトウェアエンジニア \u002F バックエンド・SRE\",\n    \"summary\": \"\",\n    \"links\": []\n  },\n  \"sections\": [\n    {\n      \"id\": \"workHistory\",\n      \"visible\": true,\n      \"type\": \"workHistory\",\n      \"entries\": []\n    },\n    {\n      \"id\": \"skills\",\n      \"visible\": true,\n      \"type\": \"skills\",\n      \"groups\": []\n    },\n    {\n      \"id\": \"qualifications\",\n      \"visible\": true,\n      \"type\": \"qualifications\",\n      \"entries\": []\n    }\n  ]\n}",29,{"id":40,"title":41,"description":42,"json":43,"lines":44},"full","現実的なフル構成","\u002Fsample で公開している見本と同じ内容です。職務経歴・スキル・資格・自由記述(任意の英字ラベル付き)がひと通り入っています。`resume.json` に保存して、上のcurlでそのまま送れます。","{\n  \"version\": 1,\n  \"basic\": {\n    \"name\": \"山田 太郎\",\n    \"title\": \"ソフトウェアエンジニア \u002F バックエンド・SRE\",\n    \"summary\": \"Webアプリケーションのバックエンドを中心に7年ほど開発しています。\\n**設計から運用まで一貫して担当する**のが得意で、直近はBtoB SaaSの基盤刷新と4名のチームリードを担当しました。\\n\\n- 得意領域: TypeScript \u002F Go でのAPI開発、PostgreSQLのパフォーマンス改善\\n- 関心: 計測にもとづく信頼性の改善と、開発者体験の底上げ\",\n    \"links\": [\n      {\n        \"label\": \"GitHub\",\n        \"url\": \"https:\u002F\u002Fgithub.com\u002Fkeirec-sample\"\n      },\n      {\n        \"label\": \"ブログ\",\n        \"url\": \"https:\u002F\u002Fexample.com\u002Fblog\"\n      }\n    ]\n  },\n  \"sections\": [\n    {\n      \"id\": \"sample-work\",\n      \"visible\": true,\n      \"type\": \"workHistory\",\n      \"entries\": [\n        {\n          \"company\": \"株式会社クレアノーツ\",\n          \"from\": \"2023-04\",\n          \"to\": \"\",\n          \"role\": \"リードエンジニア\",\n          \"description\": \"BtoB SaaS(契約社数約400社)の開発チーム4名のリードとして、機能開発とアーキテクチャの意思決定を担当。\\n\\n- 自前実装の認証をOIDCベースに移行し、SSO対応を要件とする商談の失注をゼロに\\n- 遅いエンドポイント上位20件をN+1解消とインデックス設計で改善し、p95応答を1.8秒から420msへ短縮\\n- 手動だったリリースをGitHub Actionsに載せ替え、デプロイ頻度を週1回から日次へ\\n- 設計レビューとオンボーディング資料を整備し、新メンバーの初コミットまでの日数を平均9日から3日へ\",\n          \"tech\": [\n            \"TypeScript\",\n            \"Node.js\",\n            \"PostgreSQL\",\n            \"AWS\",\n            \"Terraform\",\n            \"Datadog\"\n          ]\n        },\n        {\n          \"company\": \"合同会社ノクトリンク\",\n          \"from\": \"2020-07\",\n          \"to\": \"2023-03\",\n          \"role\": \"バックエンドエンジニア\",\n          \"description\": \"飲食店向け予約管理サービスのAPI開発と運用を担当。月間予約数は約12万件。\\n\\n- 予約枠の在庫管理をトランザクション設計から見直し、繁忙期の二重予約を解消\\n- モノリスから通知基盤だけを切り出し、ピーク時のレスポンス劣化を回避\\n- オンコール当番として障害対応と再発防止のポストモーテム運用を整備\",\n          \"tech\": [\n            \"Go\",\n            \"MySQL\",\n            \"Redis\",\n            \"Docker\",\n            \"GCP\"\n          ]\n        },\n        {\n          \"company\": \"株式会社トリムノス\",\n          \"from\": \"2019-04\",\n          \"to\": \"2020-06\",\n          \"role\": \"Webエンジニア\",\n          \"description\": \"新卒入社。社内業務システムの受託開発に従事し、要件のヒアリングから実装・保守までを担当。\\n\\n- 勤怠管理システムの改修を1人称で担当し、月次の集計作業を約8時間から30分へ短縮\\n- 手作業だったテストにE2Eテストを導入し、リグレッションの再発を防止\",\n          \"tech\": [\n            \"PHP\",\n            \"Laravel\",\n            \"MySQL\",\n            \"jQuery\"\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"sample-skills\",\n      \"visible\": true,\n      \"type\": \"skills\",\n      \"groups\": [\n        {\n          \"category\": \"言語\",\n          \"items\": [\n            \"TypeScript\",\n            \"Go\",\n            \"Python\",\n            \"SQL\"\n          ]\n        },\n        {\n          \"category\": \"フレームワーク\",\n          \"items\": [\n            \"Nuxt\",\n            \"NestJS\",\n            \"Echo\",\n            \"Laravel\"\n          ]\n        },\n        {\n          \"category\": \"インフラ\",\n          \"items\": [\n            \"AWS (ECS \u002F RDS \u002F Lambda)\",\n            \"Cloudflare Workers\",\n            \"Terraform\",\n            \"GitHub Actions\"\n          ]\n        },\n        {\n          \"category\": \"データストア\",\n          \"items\": [\n            \"PostgreSQL\",\n            \"MySQL\",\n            \"Redis\"\n          ]\n        },\n        {\n          \"category\": \"監視・運用\",\n          \"items\": [\n            \"Datadog\",\n            \"Sentry\",\n            \"OpenTelemetry\"\n          ]\n        }\n      ]\n    },\n    {\n      \"id\": \"sample-qualifications\",\n      \"visible\": true,\n      \"type\": \"qualifications\",\n      \"entries\": [\n        {\n          \"name\": \"AWS Certified Solutions Architect – Associate\",\n          \"year\": \"2023\"\n        },\n        {\n          \"name\": \"応用情報技術者\",\n          \"year\": \"2020\"\n        },\n        {\n          \"name\": \"基本情報技術者\",\n          \"year\": \"2018\"\n        }\n      ]\n    },\n    {\n      \"id\": \"sample-about\",\n      \"visible\": true,\n      \"type\": \"freeText\",\n      \"title\": \"自己PR\",\n      \"body\": \"課題を「速く直す」よりも、**同じ障害が二度起きない形に直す**ことを重視しています。\\n直近ではオンコールの負荷が特定メンバーに偏っていたため、アラートの棚卸しとRunbookの整備を提案し、月あたりの深夜対応を6件から1件に減らしました。\\n\\nチームでは、設計の意図をドキュメントとして残すこと、レビューで指摘だけでなく代替案を示すことを心がけています。\\n今後はプロダクトの信頼性設計により深く関わり、SLOにもとづく意思決定をチームに定着させたいと考えています。\"\n    },\n    {\n      \"id\": \"sample-talks\",\n      \"visible\": true,\n      \"type\": \"custom\",\n      \"title\": \"登壇・執筆\",\n      \"body\": \"- 社内勉強会で「N+1をやめるためのORMの読み方」を月1で開催(累計12回)\\n- 技術ブログでSLO運用の立ち上げについて執筆(累計8本)\",\n      \"enLabel\": \"TALKS\"\n    }\n  ]\n}",153,[46,70,77,107,129,145],{"id":47,"title":48,"fields":49},"basic","基本情報(basic)",[50,54,57,61,65],{"key":51,"field":51,"label":52,"limit":53},"basic.name","氏名","100文字",{"key":55,"field":55,"label":56,"limit":53},"basic.title","肩書き",{"key":58,"field":58,"label":59,"limit":60},"basic.summary","自己紹介(Markdown可)","2000文字",{"key":62,"field":62,"label":63,"limit":64},"basic.links","リンク","10件",{"key":66,"field":67,"label":68,"limit":69},"link.label","basic.links[].label","リンクの表示名","50文字",{"id":71,"title":72,"fields":73},"sections","セクション全体(sections)",[74],{"key":71,"field":71,"label":75,"limit":76},"セクション","30件",{"id":78,"title":79,"fields":80},"work-history","職務経歴(type: workHistory)",[81,85,89,93,98,102],{"key":82,"field":83,"label":84,"limit":76},"workHistory.entries","entries","職歴",{"key":86,"field":87,"label":88,"limit":53},"workHistory.company","entries[].company","会社名",{"key":90,"field":91,"label":92,"limit":53},"workHistory.role","entries[].role","役割",{"key":94,"field":95,"label":96,"limit":97},"workHistory.description","entries[].description","業務内容(Markdown可)","5000文字",{"key":99,"field":100,"label":101,"limit":76},"workHistory.tech","entries[].tech","技術タグ",{"key":103,"field":104,"label":105,"limit":106},"workHistory.techItem","entries[].tech[]","技術タグ1つ","30文字",{"id":108,"title":109,"fields":110},"skills","スキル(type: skills)",[111,116,120,125],{"key":112,"field":113,"label":114,"limit":115},"skills.groups","groups","カテゴリ","20件",{"key":117,"field":118,"label":119,"limit":69},"skills.category","groups[].category","カテゴリ名",{"key":121,"field":122,"label":123,"limit":124},"skills.items","groups[].items","1カテゴリの項目","50件",{"key":126,"field":127,"label":128,"limit":69},"skills.item","groups[].items[]","項目1つ",{"id":130,"title":131,"fields":132},"qualifications","資格(type: qualifications)",[133,136,140],{"key":134,"field":83,"label":135,"limit":76},"qualifications.entries","資格",{"key":137,"field":138,"label":139,"limit":53},"qualifications.name","entries[].name","資格名",{"key":141,"field":142,"label":143,"limit":144},"qualifications.year","entries[].year","取得年","20文字",{"id":146,"title":147,"fields":148},"text","自由記述(type: freeText \u002F custom)",[149,153,158],{"key":150,"field":151,"label":152,"limit":69},"text.title","title","見出し",{"key":154,"field":155,"label":156,"limit":157},"text.body","body","本文(Markdown可)","10000文字",{"key":159,"field":160,"label":161,"limit":106},"text.enLabel","enLabel","英字ラベル(任意・半角英数と記号のみ)",[163,168],{"id":164,"title":165,"description":166,"request":11,"json":167},"response-empty","まだ何も保存していないとき","空の内容と updatedAt: null が返ります。経歴書の行はこの時点では作られていません(作られるのは最初のPUTです)。","{\n  \"content\": {\n    \"version\": 1,\n    \"basic\": {\n      \"name\": \"\",\n      \"title\": \"\",\n      \"summary\": \"\",\n      \"links\": []\n    },\n    \"sections\": [\n      {\n        \"id\": \"workHistory\",\n        \"type\": \"workHistory\",\n        \"visible\": true,\n        \"entries\": []\n      },\n      {\n        \"id\": \"skills\",\n        \"type\": \"skills\",\n        \"visible\": true,\n        \"groups\": []\n      },\n      {\n        \"id\": \"qualifications\",\n        \"type\": \"qualifications\",\n        \"visible\": true,\n        \"entries\": []\n      }\n    ]\n  },\n  \"isPublished\": false,\n  \"publicId\": null,\n  \"publishedAt\": null,\n  \"updatedAt\": null,\n  \"publicUrl\": null,\n  \"hasViewPassword\": false\n}",{"id":169,"title":170,"description":171,"request":11,"json":172},"response-published","公開中のとき","content には保存済みの下書きがそのまま入ります(ここでは上の「最小構成」を保存した場合)。isPublished が true になり、publicUrl に公開ページの絶対URLがそのまま入るので、組み立てる必要はありません。非公開に戻すと publicUrl は null になりますが、publicId は残るので同じURLに再公開できます。hasViewPassword が true のときは公開URLに閲覧パスワードが掛かっていて、開くには入力が必要です。この値は読み取り専用で、設定・変更・解除はAPIからは行えません(編集画面の「公開」パネルから行います)。","{\n  \"content\": {\n    \"version\": 1,\n    \"basic\": {\n      \"name\": \"山田 太郎\",\n      \"title\": \"ソフトウェアエンジニア \u002F バックエンド・SRE\",\n      \"summary\": \"\",\n      \"links\": []\n    },\n    \"sections\": [\n      {\n        \"id\": \"workHistory\",\n        \"visible\": true,\n        \"type\": \"workHistory\",\n        \"entries\": []\n      },\n      {\n        \"id\": \"skills\",\n        \"visible\": true,\n        \"type\": \"skills\",\n        \"groups\": []\n      },\n      {\n        \"id\": \"qualifications\",\n        \"visible\": true,\n        \"type\": \"qualifications\",\n        \"entries\": []\n      }\n    ]\n  },\n  \"isPublished\": true,\n  \"publicId\": \"example-public-id-012\",\n  \"publishedAt\": \"2026-08-01T03:00:00.000Z\",\n  \"updatedAt\": \"2026-08-01T02:58:41.204Z\",\n  \"publicUrl\": \"https:\u002F\u002Fkeirec.com\u002Fr\u002Fexample-public-id-012\",\n  \"hasViewPassword\": true\n}",[174,178,187,191,195,204,216],{"status":175,"code":176,"action":177},"400","bad_request","リクエストボディがJSONとして読めません。送信内容を確認してください。",{"status":179,"code":180,"action":181,"example":182},"401","unauthorized","キーが無い・形式が違う・失効しています。理由は区別しません。設定画面で発行し直してください。",{"title":183,"description":184,"headers":185,"json":186},"401 — キーが正しくない","ヘッダが無いときも、形式が違うときも、失効済みのキーのときも同じ本文が返ります。応答の違いから「そのキーが存在するか」を判定できないようにするためです。",[],"{\n  \"code\": \"unauthorized\",\n  \"message\": \"APIキーが正しくありません\"\n}",{"status":188,"code":189,"action":190},"404","not_found","公開できる経歴書がありません。先に下書きを保存してください。",{"status":192,"code":193,"action":194},"409","key_limit_reached","キーが上限の5本に達しています。使っていないキーを失効してください。",{"status":196,"code":197,"action":198,"example":199},"422","validation_failed","errors[] に「どのフィールドがなぜ不正か」が入ります。そこを直して送り直してください。",{"title":200,"description":201,"headers":202,"json":203},"422 — フィールド単位で不正の場所が返る","氏名を上限より1文字長くし、リンクのURLからスキーム(https:\u002F\u002F)を落とし、期間を 2021\u002F04 と書いて送ったときの応答です。path が直す場所を指すので、上限値を知らなくても返ってきた内容だけで直せます。",[],"{\n  \"code\": \"validation_failed\",\n  \"message\": \"入力内容に誤りがあります\",\n  \"errors\": [\n    {\n      \"path\": \"basic.name\",\n      \"message\": \"Too big: expected string to have \u003C=100 characters\"\n    },\n    {\n      \"path\": \"basic.links.0.url\",\n      \"message\": \"Invalid URL\"\n    },\n    {\n      \"path\": \"sections.0.entries.0.from\",\n      \"message\": \"Invalid string: must match pattern \u002F^\\\\d{4}-(0[1-9]|1[0-2])$\u002F\"\n    }\n  ]\n}",{"status":205,"code":206,"action":207,"example":208},"429","rate_limited","Retry-After 秒だけ待ってから再試行してください(60秒)。",{"title":209,"description":210,"headers":211,"json":215},"429 — fair-use制限を超えた","Retry-After の秒数だけ空けて再試行してください。待てば回復するので、キーを発行し直す必要はありません。",[212],{"name":213,"value":214},"retry-after","60","{\n  \"code\": \"rate_limited\",\n  \"message\": \"fair-use制限(60リクエスト\u002F60秒)を超えました。60秒ほど待てば再び呼び出せます\"\n}",{"status":217,"code":218,"action":219},"500","internal_error","サーバー側の問題です。時間をおいて再試行してください。",1789995831892]