{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-docs/api-reference/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["api-container","api-content","endpoint","api-examples","code-group","tabs","tab"]},"redocly_category":"API Reference","searchWeight":120,"type":"markdown"},"seo":{"title":"Register or update a project group","description":"Complete API reference and documentation for Freddy AI-powered backend system by Aitronos","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"register-or-update-a-project-group","__idx":0},"children":["Register or update a project group"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Registers the Forge project group Forge knows by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_id"]},", or updates its name, parent and organization. Call it whenever a group is created, renamed, moved or given another organization in Forge, and once for every group that already exists, also the ones without an organization of their own: a group that is not registered ends the chain its child groups inherit through (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-project-groups"},"children":["List project groups"]},"). Registering a deleted group's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_id"]}," again registers it again, with what you send."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["All three fields, every time."]}," Send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["name"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["parent_client_id"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["organization_id"]}," on every call, with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," for a parent or an organization the group does not have. A rename that left one out would otherwise move the group to the top or stop billing it, so a missing field is refused with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["422 VALIDATION_ERROR"]}," rather than read as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Choosing the organization."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["organization_id"]}," is the organization Forge spend inside the group is billed to: one marked ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["selectable"]}," in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["organizations"]}," of ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-project-groups"},"children":["List project groups"]},". Any other is refused with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["403 FORGE_PROJECT_GROUP_ORGANIZATION_NOT_SELECTABLE"]},", whose ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message"]}," says why. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," makes the group follow its parent: it bills to its nearest registered ancestor's organization, or to none. Keeping the organization a group already has is never checked again, so a group whose organization became unusable can still be renamed or moved (its ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reason"]}," keeps saying why spend cannot be billed there); registering a deleted group again checks its organization like a new one. A change applies to new spend only: spend already billed stays on the organization it was billed to, and a ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/create-host"},"children":["rented server"]}," stays billed to the organization it was rented in."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Parents."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["parent_client_id"]}," is Forge's id for the group this one sits in. A parent that is not registered yet is accepted: the group follows it as soon as it is registered, and until then ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["parent_id"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," and the chain stops there. A parent that would place the group inside itself is refused with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["422 FORGE_PROJECT_GROUP_INVALID_PARENT"]},", and so is nesting deeper than 32 levels, counting the groups already registered below it (so registering children before their parents is checked too)."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Limit."]}," One person may register at most 1,000 groups. Registering one more (or registering a deleted one again) is refused with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409 FORGE_PROJECT_GROUP_LIMIT_REACHED"]},"; updating a registered group is always allowed."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A refused request writes nothing. The answer is the whole list, exactly as ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-project-groups"},"children":["List project groups"]}," returns it, so every group that follows this one shows its new organization at once. It names no organization and requires a credential that acts for a person (a bearer token, or a key belonging to a person); the group is yours alone."]},{"$$mdtype":"Tag","name":"ApiContainer","attributes":{},"children":[{"$$mdtype":"Tag","name":"ApiContent","attributes":{},"children":[{"$$mdtype":"Tag","name":"Endpoint","attributes":{"method":"PUT","path":"https://api.aitronos.com/v1/forge/project-groups/{client_id}"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"path-parameters","__idx":1},"children":["Path Parameters"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_id"]}]}," string ",{"$$mdtype":"Tag","name":"em","attributes":{"style":{"color":"#ef4444 !important","fontWeight":"600 !important","fontStyle":"normal !important"}},"children":["required"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Forge's own id for the project group: 1 to 128 characters after surrounding spaces are removed, without control characters. An id that cannot be read is refused with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VALIDATION_ERROR"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["details.reason"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["invalid_client_id"]},")."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"body-parameters","__idx":2},"children":["Body Parameters"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["name"]}]}," string ",{"$$mdtype":"Tag","name":"em","attributes":{"style":{"color":"#ef4444 !important","fontWeight":"600 !important","fontStyle":"normal !important"}},"children":["required"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The group's name, as Forge shows it: 1 to 200 characters, at least one of them visible. Surrounding whitespace is removed and every run of whitespace inside (line breaks and tabs included) becomes one space; any other control character is refused. Emoji and right-to-left text are kept as sent."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["parent_client_id"]}]}," string or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," ",{"$$mdtype":"Tag","name":"em","attributes":{"style":{"color":"#ef4444 !important","fontWeight":"600 !important","fontStyle":"normal !important"}},"children":["required"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Forge id of the group it sits in, under the same rules as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_id"]},"; ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," at the top. The parent need not be registered yet."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["organization_id"]}]}," string or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," ",{"$$mdtype":"Tag","name":"em","attributes":{"style":{"color":"#ef4444 !important","fontWeight":"600 !important","fontStyle":"normal !important"}},"children":["required"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The organization its Forge spend is billed to, one marked ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["selectable"]}," in ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-project-groups"},"children":["List project groups"]},"; ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," to follow its parent (or bill nothing to an organization when no ancestor has one). A blank string is read as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Unknown fields are refused."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"returns","__idx":3},"children":["Returns"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The whole list, exactly as ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-project-groups#returns"},"children":["List project groups"]}," returns it: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["title"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["help"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["unassigned_label"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["organizations"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["groups"]},", with the group just written in place."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"title\": \"Bill to\",\n  \"help\": \"Forge spend inside this group's projects is billed to this organization: rented servers and Forge's AI features. Groups inside it follow it unless they choose their own.\",\n  \"unassigned_label\": \"Not billed to an organization\",\n  \"organizations\": [\n    {\n      \"id\": \"org_3c1e9a7b5d2f4e8a9b0c6d1e2f3a4b5c\",\n      \"name\": \"Acme Engineering\",\n      \"logo_url\": \"https://cdn.example.com/logos/acme.png\",\n      \"selectable\": true,\n      \"reason\": null,\n      \"order\": 0\n    }\n  ],\n  \"groups\": [\n    {\n      \"id\": \"fpgrp_4b9e2c7a1d3f4e8a9c0b6d2e1f3a5b7c\",\n      \"client_id\": \"grp-clients\",\n      \"name\": \"Clients\",\n      \"parent_id\": null,\n      \"parent_client_id\": null,\n      \"organization\": {\"id\": \"org_3c1e9a7b5d2f4e8a9b0c6d1e2f3a4b5c\", \"name\": \"Acme Engineering\"},\n      \"own_organization\": {\"id\": \"org_3c1e9a7b5d2f4e8a9b0c6d1e2f3a4b5c\", \"name\": \"Acme Engineering\"},\n      \"inherited\": false,\n      \"inherited_from\": null,\n      \"billing_label\": \"Billed to Acme Engineering\",\n      \"reason\": null,\n      \"month_to_date_label\": \"CHF 12.40 this month\",\n      \"created_at\": \"2026-10-09T08:12:03.418227Z\",\n      \"updated_at\": \"2026-10-09T08:12:03.418227Z\"\n    },\n    {\n      \"id\": \"fpgrp_9d3a6e1c5b7f4a2e8c0d4b6f1a3e5c7d\",\n      \"client_id\": \"grp-acme-shop\",\n      \"name\": \"Acme Shop\",\n      \"parent_id\": \"fpgrp_4b9e2c7a1d3f4e8a9c0b6d2e1f3a5b7c\",\n      \"parent_client_id\": \"grp-clients\",\n      \"organization\": {\"id\": \"org_3c1e9a7b5d2f4e8a9b0c6d1e2f3a4b5c\", \"name\": \"Acme Engineering\"},\n      \"own_organization\": null,\n      \"inherited\": true,\n      \"inherited_from\": {\"id\": \"fpgrp_4b9e2c7a1d3f4e8a9c0b6d2e1f3a5b7c\", \"client_id\": \"grp-clients\", \"name\": \"Clients\"},\n      \"billing_label\": \"Billed to Acme Engineering, from Clients\",\n      \"reason\": null,\n      \"month_to_date_label\": \"CHF 0.00 this month\",\n      \"created_at\": \"2026-10-09T08:12:04.902114Z\",\n      \"updated_at\": \"2026-10-09T08:12:04.902114Z\"\n    }\n  ]\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"errors","__idx":4},"children":["Errors"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Status"},"children":["Status"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Code"},"children":["Code"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"When"},"children":["When"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["401"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AUTHENTICATION_REQUIRED"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No valid credential."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["403"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["API_KEY_PERSON_REQUIRED"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["An organization API key: it has no person of its own."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["403"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FORGE_PROJECT_GROUP_ORGANIZATION_NOT_SELECTABLE"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["organization_id"]}," is a new organization for the group that it may not be billed to. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message"]}," is the reason, as a sentence to show: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["You don't have permission to use Forge in this organization."]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["You are not a member of this organization."]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["This key cannot be used in this organization."]},"; ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["details.organization_id"]}," is the organization sent."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["409"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FORGE_PROJECT_GROUP_LIMIT_REACHED"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["You already have 1,000 registered groups and this call would register one more. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message"]},": \"You can register at most 1000 project groups. Delete one you no longer use and try again.\"; ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["details.limit"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1000"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["422"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FORGE_PROJECT_GROUP_INVALID_PARENT"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["parent_client_id"]}," would place the group inside itself. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["details.reason"]}," says how: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["self"]}," (its own parent: \"A project group cannot be placed inside itself.\"), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cycle"]}," (one of its own groups: \"A project group cannot be placed inside one of its own groups.\") or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["too_deep"]}," (nesting past 32 levels, the groups registered below it included: \"Project groups cannot be nested this deeply.\"). ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["details.field"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["parent_client_id"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["details.client_id"]}," the group."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["422"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VALIDATION_ERROR"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A body of the wrong shape: a missing field (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["parent_client_id"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["organization_id"]}," must be sent, as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," when there is none), an unknown field, a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["name"]}," that is empty, longer than 200 characters or holds control characters, a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["parent_client_id"]}," that is empty, longer than 128 characters or holds control characters, or an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["organization_id"]}," longer than 255 characters. Also a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_id"]}," that cannot be read (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["details.reason"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["invalid_client_id"]},")."]}]}]}]}]}]},{"$$mdtype":"Tag","name":"ApiExamples","attributes":{},"children":[{"$$mdtype":"Tag","name":"CodeGroup","attributes":{"mode":"dropdown"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","data-title":"cURL","header":{"title":"cURL","controls":{"copy":{}}},"source":"curl -X PUT \"https://api.aitronos.com/v1/forge/project-groups/grp-acme-shop\" \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Acme Shop\",\n    \"parent_client_id\": \"grp-clients\",\n    \"organization_id\": null\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","data-title":"Python SDK","header":{"title":"Python SDK","controls":{"copy":{}}},"source":"# pip install aitronos-sdk\n#\n# The Python SDK does not expose a typed `forge_project_groups` namespace yet, so\n# call the endpoint directly with the same bearer token you would pass to `Aitronos(...)`.\nimport httpx\n\nACCESS_TOKEN = \"your-access-token\"\n\nresponse = httpx.put(\n    \"https://api.aitronos.com/v1/forge/project-groups/grp-acme-shop\",\n    headers={\"Authorization\": f\"Bearer {ACCESS_TOKEN}\"},\n    # All three fields, every time: null follows the parent / sits at the top.\n    json={\"name\": \"Acme Shop\", \"parent_client_id\": \"grp-clients\", \"organization_id\": None},\n)\nif response.is_error:\n    print(response.json()[\"error\"][\"message\"])\nelse:\n    for group in response.json()[\"groups\"]:\n        print(group[\"name\"], \"-\", group[\"billing_label\"])\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","data-title":"Python","header":{"title":"Python","controls":{"copy":{}}},"source":"import os\nimport requests\n\ntoken = os.environ[\"AITRONOS_TOKEN\"]\nresponse = requests.put(\n    \"https://api.aitronos.com/v1/forge/project-groups/grp-clients\",\n    headers={\"Authorization\": f\"Bearer {token}\"},\n    json={\n        \"name\": \"Clients\",\n        \"parent_client_id\": None,\n        \"organization_id\": \"org_3c1e9a7b5d2f4e8a9b0c6d1e2f3a4b5c\",\n    },\n)\ngroups = {g[\"client_id\"]: g for g in response.json()[\"groups\"]}\nprint(groups[\"grp-clients\"][\"billing_label\"])\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","data-title":"JavaScript","header":{"title":"JavaScript","controls":{"copy":{}}},"source":"const response = await fetch(\"https://api.aitronos.com/v1/forge/project-groups/grp-acme-shop\", {\n  method: \"PUT\",\n  headers: {\n    Authorization: `Bearer ${process.env.AITRONOS_TOKEN}`,\n    \"Content-Type\": \"application/json\",\n  },\n  body: JSON.stringify({ name: \"Acme Shop\", parent_client_id: \"grp-clients\", organization_id: null }),\n});\nconst body = await response.json();\nif (!response.ok) {\n  console.log(body.error.message);\n} else {\n  console.log(body.groups.map((g) => `${g.name}: ${g.billing_label}`));\n}\n","lang":"javascript"},"children":[]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response:"]}]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"200 OK","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"title\": \"Bill to\",\n  \"help\": \"Forge spend inside this group's projects is billed to this organization: rented servers and Forge's AI features. Groups inside it follow it unless they choose their own.\",\n  \"unassigned_label\": \"Not billed to an organization\",\n  \"organizations\": [\n    {\n      \"id\": \"org_3c1e9a7b5d2f4e8a9b0c6d1e2f3a4b5c\",\n      \"name\": \"Acme Engineering\",\n      \"logo_url\": \"https://cdn.example.com/logos/acme.png\",\n      \"selectable\": true,\n      \"reason\": null,\n      \"order\": 0\n    }\n  ],\n  \"groups\": [\n    {\n      \"id\": \"fpgrp_4b9e2c7a1d3f4e8a9c0b6d2e1f3a5b7c\",\n      \"client_id\": \"grp-clients\",\n      \"name\": \"Clients\",\n      \"parent_id\": null,\n      \"parent_client_id\": null,\n      \"organization\": {\"id\": \"org_3c1e9a7b5d2f4e8a9b0c6d1e2f3a4b5c\", \"name\": \"Acme Engineering\"},\n      \"own_organization\": {\"id\": \"org_3c1e9a7b5d2f4e8a9b0c6d1e2f3a4b5c\", \"name\": \"Acme Engineering\"},\n      \"inherited\": false,\n      \"inherited_from\": null,\n      \"billing_label\": \"Billed to Acme Engineering\",\n      \"reason\": null,\n      \"month_to_date_label\": \"CHF 12.40 this month\",\n      \"created_at\": \"2026-10-09T08:12:03.418227Z\",\n      \"updated_at\": \"2026-10-09T08:12:03.418227Z\"\n    },\n    {\n      \"id\": \"fpgrp_9d3a6e1c5b7f4a2e8c0d4b6f1a3e5c7d\",\n      \"client_id\": \"grp-acme-shop\",\n      \"name\": \"Acme Shop\",\n      \"parent_id\": \"fpgrp_4b9e2c7a1d3f4e8a9c0b6d2e1f3a5b7c\",\n      \"parent_client_id\": \"grp-clients\",\n      \"organization\": {\"id\": \"org_3c1e9a7b5d2f4e8a9b0c6d1e2f3a4b5c\", \"name\": \"Acme Engineering\"},\n      \"own_organization\": null,\n      \"inherited\": true,\n      \"inherited_from\": {\"id\": \"fpgrp_4b9e2c7a1d3f4e8a9c0b6d2e1f3a5b7c\", \"client_id\": \"grp-clients\", \"name\": \"Clients\"},\n      \"billing_label\": \"Billed to Acme Engineering, from Clients\",\n      \"reason\": null,\n      \"month_to_date_label\": \"CHF 0.00 this month\",\n      \"created_at\": \"2026-10-09T08:12:04.902114Z\",\n      \"updated_at\": \"2026-10-09T08:12:04.902114Z\"\n    }\n  ]\n}\n","lang":"json"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"403 Not selectable","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"FORGE_PROJECT_GROUP_ORGANIZATION_NOT_SELECTABLE\",\n    \"message\": \"You don't have permission to use Forge in this organization.\",\n    \"system_message\": \"Forge project group organization not selectable: 'org_1a2b3c4d5e6f4a7b8c9d0e1f2a3b4c5d'\",\n    \"type\": \"authorization_error\",\n    \"status\": 403,\n    \"details\": {\"organization_id\": \"org_1a2b3c4d5e6f4a7b8c9d0e1f2a3b4c5d\"},\n    \"trace_id\": \"3f1c9a52-7d4e-4b8a-9c21-6e0d5f7a8b34\",\n    \"timestamp\": \"2026-10-09T09:00:00Z\"\n  }\n}\n","lang":"json"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"409 Limit reached","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"FORGE_PROJECT_GROUP_LIMIT_REACHED\",\n    \"message\": \"You can register at most 1000 project groups. Delete one you no longer use and try again.\",\n    \"system_message\": \"Forge project group limit reached (1000)\",\n    \"type\": \"client_error\",\n    \"status\": 409,\n    \"details\": {\"limit\": 1000},\n    \"trace_id\": \"3f1c9a52-7d4e-4b8a-9c21-6e0d5f7a8b34\",\n    \"timestamp\": \"2026-10-09T09:00:00Z\"\n  }\n}\n","lang":"json"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"422 Invalid parent","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"FORGE_PROJECT_GROUP_INVALID_PARENT\",\n    \"message\": \"A project group cannot be placed inside one of its own groups.\",\n    \"system_message\": \"Invalid Forge project group parent: cycle\",\n    \"type\": \"validation_error\",\n    \"status\": 422,\n    \"details\": {\"field\": \"parent_client_id\", \"reason\": \"cycle\", \"client_id\": \"grp-clients\"},\n    \"trace_id\": \"3f1c9a52-7d4e-4b8a-9c21-6e0d5f7a8b34\",\n    \"timestamp\": \"2026-10-09T09:00:00Z\"\n  }\n}\n","lang":"json"},"children":[]}]}]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"related-resources","__idx":5},"children":["Related Resources"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/introduction"},"children":["Forge cloud compute overview"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-billing-organizations"},"children":["List billing organizations"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/choose-billing-organization"},"children":["Choose the default billing organization"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-project-groups"},"children":["List project groups"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/put-project-group"},"children":["Register or update a project group"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/delete-project-group"},"children":["Delete a project group"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-offerings"},"children":["List compute offerings"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/get-offering-options"},"children":["Get offering options"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/resolve-offering-size"},"children":["Resolve a free size"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-credentials"},"children":["List connected accounts"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/put-credential"},"children":["Connect a cloud account"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/delete-credential"},"children":["Disconnect a cloud account"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/create-host"},"children":["Create a server"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-hosts"},"children":["List servers"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-my-hosts"},"children":["List your servers in every organization"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/get-host"},"children":["Get a server"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/get-host-usage"},"children":["Get a server's daily cost and uptime"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-host-intervals"},"children":["List a server's running intervals"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-host-events"},"children":["List a server's event history"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/report-progress"},"children":["Report a setup step"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/report-host-key"},"children":["Report the server's host key"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/report-ready"},"children":["Mark a server ready"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/report-activity"},"children":["Report activity"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/park-host"},"children":["Park a server"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/resume-host"},"children":["Resume a server"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/delete-host"},"children":["Delete a server"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/revoke-host"},"children":["Revoke a server"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/get-settings"},"children":["Get compute settings"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/update-settings"},"children":["Update compute settings"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/get-limits"},"children":["Get spend limits"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/update-organization-limits"},"children":["Change the organization's limits"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/update-my-limit"},"children":["Set your own limit"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/list-member-limits"},"children":["List member limits"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/update-member-limit"},"children":["Set a member's limit"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/api-reference/forge-compute/delete-orphan"},"children":["Delete a leftover resource"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/assets/assess-git-impact.a7bae1761a3dd82a227de8c76df41608e7e238562f3d2f420b7b3eccb4ee1234.23c4b6e8.md"},"children":["Assess a working tree's impact"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/assets/get-usage-detail-report.45870ea5b94806d0570403fa53ae031e4b48417dddf0f27bd3aa2fc29b7ba55c.49b960d1.md"},"children":["Get usage detail report"]}]}]}]},"headings":[{"value":"Register or update a project group","id":"register-or-update-a-project-group","depth":1},{"value":"Path Parameters","id":"path-parameters","depth":4},{"value":"Body Parameters","id":"body-parameters","depth":4},{"value":"Returns","id":"returns","depth":2},{"value":"Errors","id":"errors","depth":2},{"value":"Related Resources","id":"related-resources","depth":2}],"frontmatter":{"title":"Register or update a project group","keywords":["forge","project groups","billing","organization","bill to","register"],"seo":{"title":"Register or update a project group"}},"lastModified":"2026-10-26T18:32:31.578Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/api-reference/forge-compute/put-project-group","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}