POST /finance/connections and PUT /finance/connections/{connectionId}/reauthorize refuse a managed user's own access token with 403 and code: "managed_connection_requires_portal".institution_id when the user has already picked their bank in your app, or connection_id to renew one of their existing connections. The portal then skips its picker and starts that flow itself after a short interlude, so the portal reads as a quick step rather than a second bank picker. A renewal keeps the connection id and sends a connection.reauthorized webhook. A user who has not yet accepted the portal terms sees the same interlude with an "Accept and continue" button instead, and nothing starts until they press it.username:passwordAuthorization: Basic *****************curl --location 'https://api.synci.io/managed/v1/users/6bfbe0a6-2d49-4dc8-b983-fb4dfa417ea0/portal-sessions' \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '{
"return_url": "http://example.com",
"institution_id": 1,
"connection_id": 1
}'{
"data": {
"url": "string",
"expires_at": "string"
}
}