---
agentTools:
  projectIndex: https://hubflo.readme.io/llms.txt
---

# Updates the current portal

Returns the updated portal

# OpenAPI definition

````json
{
  "openapi": "3.0.1",
  "info": {
    "title": "Hubflo API",
    "version": "v2",
    "description": "The Hubflo API allows you to write and read data from the Hubflo application.\nIt conforms to [REST](https://en.wikipedia.org/wiki/REST).\nIt has predictable resource-oriented URLS, accepts JSON request bodies, returns JSON and uses standard HTTP status codes\nand verbs.\n\n# Authentication\n\nThe Hubflo API requires authentication.\nIt's a bearer authentication, also called token authentication.\n\nTo start your integration journey with the Hubflo API, you must send your **authentication token** in the\n`Authorization` header when making requests to the API.\n\n```\nAuthorization: Bearer <token>\n```\n\n# Getting started\n\nNavigate to [https://app.hubflo.com/organizations/](https://app.hubflo.com/organizations/).\nIn the **Integrations** settings panel, click on the **Generate key** button if you don't already have an API key.\n\nThe generated API key is the required authentication token you must send in the `Authorization` header.\nLet's copy it.\n\nYou can use the `/pings` endpoint to check that you can successfully make an authenticated request.\nDo it directly from this documentation, using the **Authorize** button to paste your authentication token, then push\nthe **Try it out** button.\n\nAlternatively, you can run the following cURL command in a terminal:\n\n```\ncurl -X 'POST' \\\n  'https://app.hubflo.com/api/v2/pings' \\\n  -H 'accept: application/json' \\\n  -H 'Authorization: Bearer <token>' \\\n  -d ''\n```\n\nIf you're successfully authenticated, you receive:\n\n```json\n{\n  \"pong\": \"ok\"\n}\n```\n\nOtherwise you get a `401 - Unauthorized` error. For example:\n\n```json\n{\n  \"status\": 401,\n  \"title\": \"Unauthorized\",\n  \"message\": \"API token not found\"\n}\n```\n\n# Versioning\n\nThe API is versioned. The current version is 2.0 (referenced as v2 in the endpoints).\n\n# Routes\n\nThe API endpoints are accessible through a route of the form: `https://<domain>/api/<version>/<endpoint>`.\n\nWhere:\n\n- `domain` is the domain to use, usually \"app.hubflo.com\"\n- `version` is the API version\n- `endpoint` is the endpoint name\n\nFor example, we will have: `https://app.hubflo.com/api/v2/pings`.\n\n# Request headers\n\nEvery request should include the header `Content-Type: application/json`, except for file uploads.\n\n# Requests and parameters\n\nThe API adheres to REST principles:\n\n- `GET` requests: read without modification\n- `POST` requests: create a new resource\n- `PATCH` requests: update an existing resource\n- `DELETE` requests: delete a resource\n\nThe parameters for `GET` requests should be sent via the query string of the request.\n\nThe parameters for `POST` and `PATCH` requests should be transmitted in the request body in a valid JSON format.\n\nThe parameters should follow the following formats:\n- `date`: \"YYYY-MM-DD\", for example: \"2021-10-21\"\n- `time`: \"H:m[:s]\", for example: \"10:30\"\n- `date-time`: \"YYYY-MM-DDThh:mm:ssZ\", which is the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations) format, using UTC\n\n# Response headers\n\nAs specified for each endpoint, the response headers contain:\n- `Content-Type`: the response content type\n- `X-Organization-ID`: your organization ID\n- `X-Rate-Limit` the maximum allowed requests in a given period\n- `X-Remaining-Requests`: the remaining requests count in the current period\n\n# Response format\n\nThe API only supports JSON format.\nAll responses sent by the API will contain the header `Content-Type: application/json` and their content is present in\nthe body in a JSON format to be de-serialized.\n\n# Rate limit\n\nThe use of the API is limited.\nYou can make a maximum of 1000 calls per minute.\nIf you exceed this limit, you receive a `429 - Too Many Requests` error and are blocked for one minute.\n\n# Pagination\n\nAll endpoints that return lists are paginated.\nIn general, any endpoint that returns a list can return an empty list.\n\nThe (optional) `page` parameter allows you to access a specific page.\n\nThe (optional) `per_page` parameter allows you to change the number of items on a given page.\nThe default value is 20 and it is limited to a maximum of 100.\n\n# Response codes\n\nThe API may return the following codes:\n\n| Code  | Name                  | Description                                                                      |\n| ----  | --------              | --------                                                                         |\n| `200` | Success               | Success                                                                          |\n| `201` | Created               | Resource created                                                                 |\n| `204` | No Content            | Success but the response does not contain any data (e.g., deletion)              |\n| `400` | Bad Request           | The request is invalid                                                           |\n| `401` | Unauthorized          | Authentication failed                                                            |\n| `403` | Forbidden             | Insufficient rights to perform the requested action                              |\n| `404` | Not Found             | The resource is not found                                                        |\n| `422` | Unprocessable Content  | The transmitted data is malformed                                                |\n| `429` | Too Many Requests     | Too many requests have been made                                                 |\n| `500` | Internal Server Error | An internal server error occurred (the technical team is automatically notified) |\n\n# Errors\n\nWhen an error occurs, the response code informs you about what is happening.\nThe response body contains:\n- the status code,\n- the status name, a.k.a the error title,\n- a human readable message.\n\nSee the error schemas below.\n\n# Resources\n\nAll resources are identified by a unique ID that looks like this: \"16242d6f-a808-41b7-8c4d-fe29b9b3245f\".\n\nJSON data types are used at most: `string`, `number`, `float`, `object`, `array`, `boolean` and `null`.\nDates and datetimes attributes are serialized with UTC [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations) format.\n\n\n"
  },
  "paths": {
    "/api/v2/portals": {
      "patch": {
        "summary": "Updates the current portal",
        "security": [
          {
            "bearer_auth": []
          }
        ],
        "description": "Returns the updated portal",
        "tags": [
          "portals"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Portal updated",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                },
                "description": "application/json; charset=utf-8"
              },
              "X-Organization-ID": {
                "schema": {
                  "type": "string"
                },
                "description": "The organization ID"
              },
              "X-Rate-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Max allowed requests in the current period"
              },
              "X-Remaining-Requests": {
                "schema": {
                  "type": "integer"
                },
                "description": "Remaining requests in the current period"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "example": {
                    "value": {
                      "id": "f96f2bfc-8898-4460-8217-5902b89f1777",
                      "title": "Updated portal title",
                      "headline": "Updated headline",
                      "content": "<p>Updated content</p>",
                      "default_welcome_message": "<p>Updated <strong>welcome</strong> message</p>",
                      "invite_message": "<p>Updated <strong>invite</strong> message</p>",
                      "self_signup": true,
                      "continue_with_google": true,
                      "magic_link": true,
                      "tasks_view": "board",
                      "display_folders_and_files_order": "alphabetical_az",
                      "submit_message_shortcut": "enter",
                      "allow_engine_crawlers": true,
                      "show_project_stages": true,
                      "show_seal_submissions": true,
                      "show_salables": true,
                      "show_formik_submissions": false,
                      "display_org_name_for_messages": true,
                      "contact_can_create_edit_folders_and_move_files": true,
                      "allow_publicly_visible_folders": true,
                      "contact_can_delete_files": true,
                      "contact_can_create_tasks": true,
                      "contact_tasks_edition_rights": "assigned_only",
                      "default_tasks_visibility": "assigned_only",
                      "subdomain": "client",
                      "host": "client.example.com",
                      "created_at": "2026-10-08T10:31:58Z"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: the Authorization header is missing or invalid",
            "content": {
              "application/json": {
                "examples": {
                  "example": {
                    "value": {
                      "status": 401,
                      "title": "Unauthorized",
                      "message": "Invalid API token"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/error_unauthorized"
                }
              }
            }
          },
          "429": {
            "description": "too many requests: the user has reached the rate limit",
            "content": {
              "application/json": {
                "examples": {
                  "example": {
                    "value": {
                      "status": 429,
                      "title": "Too Many Requests",
                      "message": "Rate limit reached. Please wait for a couple of minutes."
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/error_too_many_requests"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "example": "My Portal"
                  },
                  "headline": {
                    "type": "string",
                    "example": "Welcome to my space"
                  },
                  "content": {
                    "type": "string",
                    "example": "<p>Some <strong>HTML</strong> content</p>"
                  },
                  "default_welcome_message": {
                    "type": "string",
                    "example": "<p>Welcome aboard!</p>"
                  },
                  "invite_message": {
                    "type": "string",
                    "example": "<p>You are invited!</p>"
                  },
                  "self_signup": {
                    "type": "boolean",
                    "example": true
                  },
                  "continue_with_google": {
                    "type": "boolean",
                    "example": true
                  },
                  "magic_link": {
                    "type": "boolean",
                    "example": true
                  },
                  "tasks_view": {
                    "type": "string",
                    "enum": [
                      "list_status",
                      "list_sections",
                      "board"
                    ],
                    "example": "board"
                  },
                  "display_folders_and_files_order": {
                    "type": "string",
                    "enum": [
                      "manual",
                      "alphabetical_az",
                      "alphabetical_za",
                      "creation_date_oldest",
                      "creation_date_newest"
                    ],
                    "example": "alphabetical_az"
                  },
                  "submit_message_shortcut": {
                    "type": "string",
                    "enum": [
                      "meta_enter",
                      "enter"
                    ],
                    "example": "enter"
                  },
                  "allow_engine_crawlers": {
                    "type": "boolean",
                    "example": true
                  },
                  "show_project_stages": {
                    "type": "boolean",
                    "example": true
                  },
                  "show_seal_submissions": {
                    "type": "boolean",
                    "example": true
                  },
                  "show_salables": {
                    "type": "boolean",
                    "example": true
                  },
                  "display_org_name_for_messages": {
                    "type": "boolean",
                    "example": true
                  },
                  "contact_can_create_edit_folders_and_move_files": {
                    "type": "boolean",
                    "example": true
                  },
                  "allow_publicly_visible_folders": {
                    "type": "boolean",
                    "example": true
                  },
                  "contact_can_delete_files": {
                    "type": "boolean",
                    "example": true
                  },
                  "contact_can_create_tasks": {
                    "type": "boolean",
                    "example": true
                  },
                  "contact_tasks_edition_rights": {
                    "type": "string",
                    "enum": [
                      "all",
                      "assigned_only",
                      "none"
                    ],
                    "example": "assigned_only"
                  },
                  "default_tasks_visibility": {
                    "type": "string",
                    "enum": [
                      "all",
                      "assigned_only"
                    ],
                    "example": "assigned_only"
                  }
                }
              }
            }
          },
          "required": true,
          "description": "Portal attributes"
        }
      }
    }
  },
  "servers": [
    {
      "url": "https://app.hubflo.com",
      "description": "The production API server"
    },
    {
      "url": "https://staging.hubflo.com",
      "description": "The staging API server"
    },
    {
      "url": "http://localhost:3000",
      "description": "The local API server"
    }
  ],
  "components": {
    "securitySchemes": {
      "bearer_auth": {
        "type": "http",
        "scheme": "bearer"
      }
    },
    "schemas": {
      "error_unauthorized": {
        "description": "A response describing an authentication error",
        "type": "object",
        "properties": {
          "status": {
            "type": "integer",
            "example": 401
          },
          "title": {
            "type": "string",
            "example": "Unauthorized"
          },
          "message": {
            "type": "string",
            "example": "API token not found"
          }
        },
        "required": [
          "status",
          "title",
          "message"
        ]
      },
      "error_too_many_requests": {
        "description": "A response describing a rate limit error",
        "type": "object",
        "properties": {
          "status": {
            "type": "integer",
            "example": 429
          },
          "title": {
            "type": "string",
            "example": "Too Many Requests"
          },
          "message": {
            "type": "string",
            "example": "Rate limit reached. Please wait for a couple of minutes."
          }
        },
        "required": [
          "status",
          "title",
          "message"
        ]
      }
    }
  },
  "x-readme": {
    "explorer-enabled": true,
    "proxy-enabled": true
  },
  "_id": {
    "buffer": {
      "0": 102,
      "1": 23,
      "2": 174,
      "3": 218,
      "4": 191,
      "5": 119,
      "6": 176,
      "7": 0,
      "8": 103,
      "9": 211,
      "10": 245,
      "11": 119
    }
  }
}
````