A MASV Portal is a brandable file transfer web page hosted by MASV with a custom URL. End users can visit the page to upload files to MASV. After the sender has uploaded files, MASV notifies the specified email addresses associated with the Portal.
Each Portal can override the default number of days that MASV stores an uploaded package with the custom_expiry_days property. Setting it to -1 specifies storage for an indefinite period if the Team’s plan allows it.
Extended Storage charges will be incurred beyond the free period included with the Team’s plan. For details, see How does Extended Storage Work and Pricing .
A Portal’s access level can be regular or private . By default, all Portals are regular.
Packages received via a regular Portal can be viewed by all Team members, while packages uploaded to private Portals are accessible only for the Team members included in the Portal’s access list.
Method Route POST/v1/teams/{team_id}/portals
Name Type Required Description X-API-KEYString Yes API key Content-TypeString Yes Must be application/json
Name Type Required Description team_idString Yes The Team ID to bind the Portal to
Name Type Required Description nameString Yes Name of the Portal subdomainString Yes Subdomain of the Portal messageString No Message displayed on the Portal upload page has_access_codeBoolean No Enable/disable access code access_codeString No Access code for the Portal page activeBoolean No Enable/disable Portal page. Default: false recipientsString[] No Email(s) that will receive notifications has_download_passwordBoolean No Enable/disable download password. Default: false download_passwordString No Password to protect download access custom_expiry_daysInteger No Storage days for packages. Range: -1 to 65535 cloud_connectionsObject[] No Cloud connections attached to the Portal. See Cloud Connections custom_webhooksObject[] No Custom webhooks attached to the Portal. See Webhooks tagObject No Tag object for the Portal. See Tags access_levelString No regular or private. Default: regularteamspace_idString No ID of the Teamspace to bind the Portal to terms_of_service_enabledBoolean No Enable/disable Terms of Service checkbox terms_of_serviceObject No Custom terms of service object package_size_restriction_enabledBoolean No Enable/disable package size restrictions max_package_sizeInteger No Maximum package size in bytes max_file_sizeInteger No Maximum individual file size in bytes max_file_countInteger No Maximum number of files file_type_restriction_enabledBoolean No Enable/disable file type restrictions file_typesString[] No Allowed file extensions (e.g., ".mov", ".mp4") expiry_enabledBoolean No Enable/disable Portal expiry expiryString No Portal expiry date-time. Format: ISO 8601
curl -d ' {"name": "$NAME", "subdomain": "$SUBDOMAIN", "recipients": ["$R1_EMAIL"], "has_access_code": false, "active": true} ' \
-H " X-API-KEY: $API_KEY " \
-H " Content-Type: application/json " \
-X POST https://api.massive.app/v1/teams/ $TEAM_ID /portals
Returns 201 Created with the full Portal object.
Method Route PUT/v1/portals/{portal_id}
Name Type Required Description X-API-KEYString Yes API key Content-TypeString Yes Must be application/json
Same fields as creating a Portal. When updating, provide the full Portal object. A typical workflow: Get Portal → Modify Fields → Update Portal.
curl -d ' {"name": "$NAME", "subdomain": "$SUBDOMAIN", "active": true, "has_access_code": false} ' \
-H " X-API-KEY: $API_KEY " \
-H " Content-Type: application/json " \
-X PUT https://api.massive.app/v1/portals/ $PORTAL_ID
Returns 200 OK with the updated Portal object.
Method Route GET/v1/portals/{portal_id}
Name Type Required Description X-API-KEYString Yes API key
curl -H " X-API-KEY: $API_KEY " \
-X GET https://api.massive.app/v1/portals/ $PORTAL_ID
Returns 200 OK with the Portal object.
Method Route GET/v1.1/teams/{team_id}/portals
Name Type Required Description X-API-KEYString Yes API key Content-TypeString Yes Must be application/json
Name Type Required Description pageInteger No Page number. Default: 1 limitInteger No Records per page, 1–50. Default: 50 sortString No Sort ascending (fieldname) or descending (-fieldname). Accepted: name, created_at, active nameString No Substring match on Portal name subdomainString No Substring match on Portal subdomain tagsString No Comma-separated tag IDs teamspacesString No Comma-separated Teamspace IDs
curl -H " X-API-KEY: $API_KEY " \
-X GET " https://api.massive.app/v1.1/teams/ $TEAM_ID /portals?page=1&limit=10 "
Returns 200 OK with metadata.total and records array.
Method Route GET/v1.1/portals/{portal_id}/packages
Name Type Required Description X-API-KEYString Yes API key Content-TypeString Yes Must be application/json
Name Type Required Description pageInteger No Page number. Default: 1 limitInteger No Records per page, 1–50. Default: 50 sortString No Sort ascending or descending tagsString No Comma-separated tag IDs senderString No Filter by sender email created_at_startString No Created after date (ISO 8601) created_at_endString No Created before date (ISO 8601) expiry_startString No Expires after date expiry_endString No Expires before date extra_storageBoolean No Filter by extra storage usage
curl -H " X-API-KEY: $API_KEY " \
-X GET " https://api.massive.app/v1.1/portals/ $PORTAL_ID /packages?page=1&limit=3 "
Returns 200 OK with metadata.total and records array of package objects.