{
  "endpoint": "CollectionHandler2",
  "preferredHttpPath": "c",
  "alternateHttpPaths": [
    "HttpCollection"
  ],
  "summary": "Collection and upload related APIs.",
  "description": "A \u0022collection\u0022 is a group of uploads, usually photos or videos, but not necessarily.\n            The owner of a collection can share various types of access with other users.\n            Each upload in the collection is comprised of the raw original upload, a thumbnail, a possibly scaled-down version for online viewing, and metadata.\n            Both collections and uploads can have reactions, polls and discussions attached to them (see the other endpoints for details on that).\n            Uploads can be copied between collections.\n            The original binary version of uploads can be downloaded in bulk in various combinations as a zip file.\n            Users always have full rights to anything they themselves have uploaded.\n            Collections currently have two types of custom invitations, one for inviting users to contribute uploads to the collection (but not see what others have uploaded),\n            and one to add various other rights to other users contributions (see the invitation endpoint for more details on invitations).\n            Invitation links can be revoked at any time, and the rights given to users through an invitation can also be modified by the collection owner at any time.\n            For users with rights to see the information, the system also keeps track of who uploaded each photo and allows filtering the uploads by user or by upload date, or just to see a list of users who have joined the collection.",
  "apis": [
    {
      "name": "TrackedTrashDownload",
      "httpMethod": "GET",
      "httpPathRegex": "^/tdl/(?<collectionId>[^?/&]+)/(?<downloadType>[^?/&]+)/(?<uploadId>[^?/&]+)",
      "subPathPattern": "/tdl/{collectionId}/{downloadType}/{uploadId}",
      "summary": "Performs a tracked download, tracking the download of the indicated file.\n            There is no need for the frontend to call this API directly--a URL to it will be returned from <see cref=\"M:PicMeApi.CollectionApis.GetDeletedUpload(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,System.Uri,AmbientServices.AuthToken,PicMeModel.CollectionId,PicMeModel.UploadId)\" />.\n            This function is not available in Lambda.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection the desired upload is in."
        },
        {
          "name": "uploadId",
          "required": true,
          "type": "UploadId",
          "description": "The <see cref=\"T:PicMeModel.UploadId\" /> for the desired upload."
        },
        {
          "name": "downloadType",
          "required": true,
          "type": "TrackedDownloadType",
          "description": "The <see cref=\"T:PicMeLogic.TrackedDownloadType\" /> indicating what part of the upload is being downloaded."
        },
        {
          "name": "attachment",
          "required": false,
          "type": "Boolean",
          "description": "When <c>true</c>, sets <c>Content-Disposition: attachment</c> so browsers save the file with the correct filename rather than guessing the extension from the OS MIME registry."
        }
      ],
      "return": {
        "type": "RedirectResponse",
        "description": "A redirect to the desired file."
      }
    },
    {
      "name": "TrackedDownload",
      "httpMethod": "GET",
      "httpPathRegex": "^/dl/(?<collectionId>[^?/&]+)/(?<downloadType>[^?/&]+)/(?<uploadId>[^?/&]+)",
      "subPathPattern": "/dl/{collectionId}/{downloadType}/{uploadId}",
      "summary": "Performs a tracked download, tracking the download of the indicated file.\n            There is no need for the frontend to call this API directly--a URL to it will be returned from <see cref=\"M:PicMeApi.CollectionApis.GetUpload(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,System.Uri,AmbientServices.AuthToken,PicMeModel.CollectionId,PicMeModel.UploadId)\" />.\n            This function is not available in Lambda.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection the desired upload is in."
        },
        {
          "name": "uploadId",
          "required": true,
          "type": "UploadId",
          "description": "The <see cref=\"T:PicMeModel.UploadId\" /> for the desired upload."
        },
        {
          "name": "downloadType",
          "required": true,
          "type": "TrackedDownloadType",
          "description": "The <see cref=\"T:PicMeLogic.TrackedDownloadType\" /> indicating what part of the upload is being downloaded."
        },
        {
          "name": "attachment",
          "required": false,
          "type": "Boolean",
          "description": "When <c>true</c>, sets <c>Content-Disposition: attachment</c> so browsers save the file with the correct filename rather than guessing the extension from the OS MIME registry."
        }
      ],
      "return": {
        "type": "RedirectResponse",
        "description": "A redirect to the desired file."
      }
    },
    {
      "name": "GetDeletedUpload",
      "httpMethod": "GET",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/deletedUpload/(?<uploadId>[^?/&]+)",
      "subPathPattern": "/collection/{collectionId}/deletedUpload/{uploadId}",
      "summary": "Gets both full metadata and a URI for the \"details\" version of a deleted upload.\n            If the upload has not been deleted, this function will throw an exception.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.Read\" /> and <see cref=\"F:AmbientServices.CollectionRights.Delete\" /> participation rights on the collection.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection the desired upload is in."
        },
        {
          "name": "uploadId",
          "required": true,
          "type": "UploadId",
          "description": "The <see cref=\"T:PicMeModel.UploadId\" /> for the desired upload."
        }
      ],
      "return": {
        "type": "GetDeletedUploadResponse2",
        "description": "A <see cref=\"T:PicMeApi.GetDeletedUploadResponse2\" /> containing the response."
      }
    },
    {
      "name": "ListLinksFrom",
      "httpMethod": "GET",
      "httpPathRegex": "^/linksFrom/(?<linkRelationshipType>[^?/&]+)/(?<collectionId>[^?/&]+)",
      "subPathPattern": "/linksFrom/{linkRelationshipType}/{collectionId}",
      "summary": "Lists links from the specified collection.\n            Requires ownership of the collection.",
      "parameters": [
        {
          "name": "linkRelationshipType",
          "required": true,
          "type": "LinkRelationshipType",
          "description": "The <see cref=\"T:AmbientServices.LinkRelationshipType\" /> for the desired links."
        },
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection whose links are wanted."
        }
      ],
      "return": {
        "type": "ListLinksToResponse2",
        "description": "A <see cref=\"T:PicMeApi.ListLinksToResponse2\" /> containing the response."
      }
    },
    {
      "name": "DeleteCollectionCoverPhoto",
      "httpMethod": "DELETE",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/coverPhoto/(?<photoId>[^?/&]+)",
      "subPathPattern": "/collection/{collectionId}/coverPhoto/{photoId}",
      "summary": "Deletes the cover photo for a collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.Update\" /> rights on the collection.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> whose cover photo is to be deleted."
        }
      ],
      "return": {
        "type": "DeleteCollectionCoverPhotoResponse2",
        "description": "A <see cref=\"T:PicMeApi.DeleteCollectionCoverPhotoResponse2\" /> containing the repsonse."
      }
    },
    {
      "name": "ListLinksTo",
      "httpMethod": "GET",
      "httpPathRegex": "^/linksTo/(?<linkRelationshipType>[^?/&]+)/(?<collectionId>[^?/&]+)",
      "subPathPattern": "/linksTo/{linkRelationshipType}/{collectionId}",
      "summary": "Lists links to the specified collection.\n            Requires ownership of the collection.",
      "parameters": [
        {
          "name": "linkRelationshipType",
          "required": true,
          "type": "LinkRelationshipType",
          "description": "The <see cref=\"T:AmbientServices.LinkRelationshipType\" /> for the desired links."
        },
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection whose links are wanted."
        }
      ],
      "return": {
        "type": "ListLinksToResponse2",
        "description": "A <see cref=\"T:PicMeApi.ListLinksToResponse2\" /> containing the response."
      }
    },
    {
      "name": "GetUpload",
      "httpMethod": "GET",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/upload/(?<uploadId>[^?/&]+)",
      "subPathPattern": "/collection/{collectionId}/upload/{uploadId}",
      "summary": "Gets both full metadata and a URI for the \"details\" version of the upload.\n            If the upload has been deleted, this function will throw an exception.\n            If the user is not the user who created the upload, requires <see cref=\"F:AmbientServices.CollectionRights.Read\" /> participation rights on the collection uploads.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection the desired upload is in."
        },
        {
          "name": "uploadId",
          "required": true,
          "type": "UploadId",
          "description": "The <see cref=\"T:PicMeModel.UploadId\" /> for the desired upload."
        }
      ],
      "return": {
        "type": "GetUploadResponse2",
        "description": "A <see cref=\"T:PicMeApi.GetUploadResponse2\" /> containing the response."
      }
    },
    {
      "name": "PatchUpload",
      "httpMethod": "PATCH",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/upload/(?<uploadId>[^?/&]+)",
      "subPathPattern": "/collection/{collectionId}/upload/{uploadId}",
      "summary": "Patches an existing upload with new data (at least the parts that are editable).\n            Requires <see cref=\"F:AmbientServices.CollectionRights.Update\" /> participation rights on the collection uploads.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> identifying the collection the upload should belong to."
        },
        {
          "name": "uploadId",
          "required": true,
          "type": "UploadId",
          "description": "The <see cref=\"T:PicMeModel.UploadId\" /> identifying the upload within this collection that is to be patched."
        },
        {
          "name": "body",
          "required": true,
          "type": "Upload",
          "partial": true,
          "description": "The partial <see cref=\"T:PicMeModel.Upload\" /> data from the request body."
        },
        {
          "name": "anonymous",
          "required": false,
          "type": "Boolean",
          "description": "When true (typically via query string), strips uploader-identifying fields on this upload."
        }
      ],
      "return": {
        "type": "PatchUploadResponse2",
        "description": "A <see cref=\"T:PicMeApi.PatchUploadResponse2\" /> which contains the recorded metadata for the upload and the <see cref=\"T:System.Uri\" />s needed to upload the binary data and download the thumbnail when it gets generated."
      }
    },
    {
      "name": "DeleteUpload",
      "httpMethod": "DELETE",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/upload/(?<uploadId>[^?/&]+)",
      "subPathPattern": "/collection/{collectionId}/upload/{uploadId}",
      "summary": "Deletes an upload from a collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.Delete\" /> participation rights on the collection.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection whose upload is to be deleted."
        },
        {
          "name": "uploadId",
          "required": true,
          "type": "UploadId",
          "description": "The <see cref=\"T:PicMeModel.UploadId\" /> identifying which upload should be deleted."
        }
      ],
      "return": {
        "type": "DeleteUploadResponse2",
        "description": "A <see cref=\"T:PicMeApi.DeleteUploadResponse2\" /> containing the response."
      }
    },
    {
      "name": "CopyUpload",
      "httpMethod": "POST",
      "httpPathRegex": "^/collection/(?<destinationCollectionId>[^?/&]+)/upload/from",
      "subPathPattern": "/collection/{destinationCollectionId}/upload/from",
      "summary": "Copies the specified source upload from the source collection to the specified destination collection.\n            If the user is not the user who created the upload, requires <see cref=\"F:AmbientServices.CollectionRights.Read\" /> participation rights on the source collection uploads.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.Create\" /> participation rights on the destination collection uploads.\n            If an upload already with the specified identified hash already exists and <paramref name=\"allowDuplicates\" /> is false, an <see cref=\"T:AmbientServices.AlreadyExistsException\" /> will be thrown and this exception will contain identifiers for the duplicate upload in case the client wants to show it to the user.",
      "parameters": [
        {
          "name": "caption",
          "required": true,
          "type": "String?",
          "description": "An optional string containing a caption or description for the upload."
        },
        {
          "name": "sourceCollectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> identifying the collection the source upload belongs to."
        },
        {
          "name": "sourceUploadId",
          "required": true,
          "type": "UploadId",
          "description": "The <see cref=\"T:PicMeModel.UploadId\" /> identifying the upload to copy."
        },
        {
          "name": "destinationCollectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> identifying the destination collection."
        },
        {
          "name": "anonymous",
          "required": false,
          "type": "Boolean",
          "description": "true to ignore any identifying network and user agent information.  defaults to false."
        },
        {
          "name": "allowDuplicates",
          "required": false,
          "type": "Boolean",
          "description": "Whether to allow an upload with the same <see cref=\"P:PicMeModel.Upload.IdentifiedHash\" /> as an existing upload."
        },
        {
          "name": "ignoreDiscussion",
          "required": false,
          "type": "Boolean",
          "description": "Whether to ignore copying discussion messages from the source upload to the destination upload.  Defaults to true."
        },
        {
          "name": "ignorePoll",
          "required": false,
          "type": "Boolean",
          "description": "Whether to ignore copying poll responses from the source upload to the destination upload.  Defaults to true."
        },
        {
          "name": "useCopierAsUploader",
          "required": false,
          "type": "Boolean",
          "description": "Whether to use the copier's user ID as the uploader for the new upload.  Defaults to false, which means the original uploader will be used."
        }
      ],
      "return": {
        "type": "CopyUploadResponse2",
        "description": "A <see cref=\"T:PicMeApi.CopyUploadResponse2\" /> which contains information about the upload, which will proceed in the background."
      }
    },
    {
      "name": "ListDeletedUploadDetails",
      "httpMethod": "GET",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/deletedUploadDetails",
      "subPathPattern": "/collection/{collectionId}/deletedUploadDetails",
      "summary": "Lists details for deleted uploads in a collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.Delete\" /> and <see cref=\"F:AmbientServices.CollectionRights.List\" /> participation rights on the collection.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> whose cover photo is to be updated."
        },
        {
          "name": "continuation",
          "required": false,
          "type": "String?",
          "description": "An optional continuation from a previous call that will continue the listing where the previous listing ended."
        },
        {
          "name": "uploadsPerPage",
          "required": false,
          "type": "Int32?",
          "description": "The maximum number of uploads to return."
        },
        {
          "name": "includeDiscussionMessageCounts",
          "required": false,
          "type": "Boolean",
          "description": "Whether to include discussion message (comment) counts or not (defaults to true)."
        },
        {
          "name": "includePollSelectionCounts",
          "required": false,
          "type": "Boolean",
          "description": "Whether to include poll selection (like) counts or not (defaults to true)."
        }
      ],
      "return": {
        "type": "ListDeletedUploadDetailsResponse",
        "description": "A <see cref=\"T:PicMeApi.ListDeletedUploadDetailsResponse\" /> containing the results."
      }
    },
    {
      "name": "GetCollectionModificationStamp",
      "httpMethod": "GET",
      "httpPathRegex": "^/collectionModificationStamp/(?<collectionId>[^?/&]+)",
      "subPathPattern": "/collectionModificationStamp/{collectionId}",
      "summary": "Gets the collection modification stamp, which changes every time the collection is updated.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> whose stamp is desired."
        }
      ],
      "return": {
        "type": "GetCollectionModificationStampResponse2",
        "description": "A <see cref=\"T:PicMeApi.GetCollectionModificationStampResponse2\" /> containing the requested information."
      }
    },
    {
      "name": "PutCollectionCoverPhoto",
      "httpMethod": "GET",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/coverPhoto/urls",
      "subPathPattern": "/collection/{collectionId}/coverPhoto/urls",
      "summary": "Puts a new cover photo for a collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.Update\" /> rights on the collection.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> whose cover photo is to be updated."
        },
        {
          "name": "contentType",
          "required": true,
          "type": "String",
          "description": "The RFC MIME-type for the photo being uploaded."
        }
      ],
      "return": {
        "type": "PutCollectionCoverPhotoResponse",
        "description": "A <see cref=\"T:PicMeApi.PutCollectionCoverPhotoResponse\" /> containing the response."
      }
    },
    {
      "name": "ListUploadDetails",
      "httpMethod": "GET",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/uploadDetails",
      "subPathPattern": "/collection/{collectionId}/uploadDetails",
      "summary": "Lists the details for uploads in a collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.List\" /> and <see cref=\"F:AmbientServices.CollectionRights.Read\" /> participation rights on the collection uploads.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection whose uploads are desired."
        },
        {
          "name": "filter",
          "required": false,
          "type": "UploadCondition?",
          "description": "An optional <see cref=\"T:PicMeModel.UploadCondition\" /> indicating attributes that must be matched for the uploads to be in the returned list."
        },
        {
          "name": "continuation",
          "required": false,
          "type": "String?",
          "description": "An optional string returned in the response from a previous call that may be used to continue listing with the next page of results."
        },
        {
          "name": "uploadsPerPage",
          "required": false,
          "type": "Int32?",
          "description": "The number of uploads to return per page.  Defaults to 100."
        },
        {
          "name": "includeDiscussionMessageCounts",
          "required": false,
          "type": "Boolean",
          "description": "Whether to include discussion message (comment) counts or not (defaults to true)."
        },
        {
          "name": "includePollSelectionCounts",
          "required": false,
          "type": "Boolean",
          "description": "Whether to include poll selection (like) counts or not (defaults to true)."
        },
        {
          "name": "sortBy",
          "required": false,
          "type": "String?",
          "description": "A property name to sort by, optionally preceded by a dash to indicate descending."
        }
      ],
      "return": {
        "type": "ListUploadDetailsResponse",
        "description": "A <see cref=\"T:PicMeApi.ListUploadDetailsResponse\" /> containing the response."
      }
    },
    {
      "name": "ListDeletedUploads",
      "httpMethod": "GET",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/deletedUpload",
      "subPathPattern": "/collection/{collectionId}/deletedUpload",
      "summary": "Lists deleted uploads in a collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.Delete\" /> and <see cref=\"F:AmbientServices.CollectionRights.List\" /> participation rights on the collection.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> whose cover photo is to be updated."
        },
        {
          "name": "continuation",
          "required": false,
          "type": "String?",
          "description": "An optional continuation from a previous call that will continue the listing where the previous listing ended."
        },
        {
          "name": "uploadsPerPage",
          "required": false,
          "type": "Int32?",
          "description": "The maximum number of uploads to return."
        }
      ],
      "return": {
        "type": "ListDeletedUploadsResponse2",
        "description": "A <see cref=\"T:PicMeApi.ListDeletedUploadsResponse2\" /> containing the results."
      }
    },
    {
      "name": "RestoreDeletedUploads",
      "httpMethod": "POST",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/deletedUpload",
      "subPathPattern": "/collection/{collectionId}/deletedUpload",
      "summary": "Restores one or more deleted uploads to a collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.Delete\" /> participation rights on the collection.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> whose upload is to be restored."
        },
        {
          "name": "uploadIds",
          "required": false,
          "type": "UploadId[]?",
          "description": "An optional array of <see cref=\"T:PicMeModel.UploadId\" />s (JSON-formatted). If not specified, restores *all* deleted uploads."
        }
      ],
      "return": {
        "type": "RestoreDeletedUploadsResponse2",
        "description": "A <see cref=\"T:PicMeApi.RestoreDeletedUploadsResponse2\" /> containing the response."
      }
    },
    {
      "name": "ListUploadKeywords",
      "httpMethod": "GET",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/uploadTerms",
      "subPathPattern": "/collection/{collectionId}/uploadTerms",
      "summary": "Lists the keywords for a given property used by uploads in the specified collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.List\" /> participation rights on the collection uploads.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection whose uploads are desired."
        },
        {
          "name": "propertyPath",
          "required": true,
          "type": "String",
          "description": "The period-separated path to the property whose terms are desired."
        },
        {
          "name": "keyWordPrefix",
          "required": false,
          "type": "String",
          "description": "An optional string which indicates what the user has already typed--all the returned keywords will start with this string."
        }
      ],
      "return": {
        "type": "ListUploadKeywordsResponse",
        "description": "A <see cref=\"T:PicMeApi.ListUploadKeywordsResponse\" /> containing the response."
      }
    },
    {
      "name": "GetOrStartPartialZipOfOriginals",
      "httpMethod": "POST",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/zip/partial",
      "subPathPattern": "/collection/{collectionId}/zip/partial",
      "summary": "Gets an existing or starts a new zip of the originals for the specified uploads in the collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.List\" /> and <see cref=\"F:AmbientServices.CollectionRights.Read\" /> participation rights on the collection and <see cref=\"F:AmbientServices.CollectionRights.List\" /> and <see cref=\"F:AmbientServices.CollectionRights.Read\" /> rights on the collection.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection the desired upload is in."
        },
        {
          "name": "uploadIds",
          "required": true,
          "type": "UploadId[]",
          "description": "An array of <see cref=\"T:PicMeModel.UploadId\" />s indicating which uploads should be included in the zip."
        }
      ],
      "return": {
        "type": "GetOrStartPartialZipOfOriginalsResponse2",
        "description": "A <see cref=\"T:PicMeApi.GetOrStartPartialZipOfOriginalsResponse2\" /> containing the response."
      }
    },
    {
      "name": "TrackedZipDownload",
      "httpMethod": "GET",
      "httpPathRegex": "^/zdl/(?<collectionId>[^?/&]+)/(?<zipId>[^?/&]+)",
      "subPathPattern": "/zdl/{collectionId}/{zipId}",
      "summary": "Performs a tracked zip download, tracking the download of the indicated zip file.\n            The <paramref name=\"zipId\" /> should come from <see cref=\"P:PicMeModel.ZipStatus.ZipId\" />.\n            This function is not available in Lambda.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection the desired zip belongs to."
        },
        {
          "name": "zipId",
          "required": true,
          "type": "String",
          "description": "A string identifying the zip file to download."
        }
      ],
      "return": {
        "type": "RedirectResponse",
        "description": "A redirect to the desired file."
      }
    },
    {
      "name": "GetOrStartFullZipOfOriginals",
      "httpMethod": "POST",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/zip/full",
      "subPathPattern": "/collection/{collectionId}/zip/full",
      "summary": "Gets an existing or starts a new zip of the originals for all the uploads in the collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.List\" /> and <see cref=\"F:AmbientServices.CollectionRights.Read\" /> participation rights on the collection and <see cref=\"F:AmbientServices.CollectionRights.List\" /> and <see cref=\"F:AmbientServices.CollectionRights.Read\" /> rights on the collection.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection the desired upload is in."
        }
      ],
      "return": {
        "type": "GetOrStartFullZipOfOriginalsResponse2",
        "description": "A <see cref=\"T:PicMeApi.GetOrStartFullZipOfOriginalsResponse2\" /> containing the response."
      }
    },
    {
      "name": "CreateUpload",
      "httpMethod": "POST",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/upload",
      "subPathPattern": "/collection/{collectionId}/upload",
      "summary": "Creates a new upload and gets a <see cref=\"T:System.Uri\" /> to PUT the binary data.  Fails if an upload with the specified hash already exists.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.Create\" /> participation rights on the collection uploads.\n            If an upload already with the specified identified hash already exists and <paramref name=\"allowDuplicates\" /> is false, an <see cref=\"T:AmbientServices.AlreadyExistsException\" /> will be thrown and this exception will contain identifiers for the duplicate upload in case the client wants to show it to the user.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> identifying the collection the upload should belong to."
        },
        {
          "name": "body",
          "required": true,
          "type": "Upload",
          "partial": true,
          "description": "The partial <see cref=\"T:PicMeModel.Upload\" /> data from the request body (supports legacy keys <c>filename</c> and <c>contentType</c>)."
        },
        {
          "name": "allowDuplicates",
          "required": false,
          "type": "Boolean",
          "description": "Whether to allow an upload with the same <see cref=\"P:PicMeModel.Upload.IdentifiedHash\" /> as an existing upload."
        },
        {
          "name": "anonymous",
          "required": false,
          "type": "Boolean",
          "description": "When true (typically via query string), uploader-identifying fields are stripped as for an anonymous upload."
        }
      ],
      "return": {
        "type": "CreateUploadResponse2",
        "description": "A <see cref=\"T:PicMeApi.CreateUploadResponse2\" /> which contains the recorded metadata for the upload and the <see cref=\"T:System.Uri\" />s needed to upload the binary data and download the thumbnail when it gets generated."
      }
    },
    {
      "name": "ListUploads",
      "httpMethod": "GET",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/upload",
      "subPathPattern": "/collection/{collectionId}/upload",
      "summary": "Lists the uploads in a collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.List\" /> participation rights on the collection uploads.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection whose uploads are desired."
        },
        {
          "name": "filter",
          "required": false,
          "type": "UploadCondition?",
          "description": "An optional <see cref=\"T:PicMeModel.UploadCondition\" /> indicating attributes that must be matched for the uploads to be in the returned list."
        },
        {
          "name": "filterQuery",
          "required": false,
          "type": "UploadQuery?",
          "description": "[DEPRECATED: USE filter INSTEAD] An optional <see cref=\"T:PicMeModel.UploadQuery\" /> indicating attributes that must be matched for the uploads to be in the returned list."
        },
        {
          "name": "continuation",
          "required": false,
          "type": "String?",
          "description": "An optional string returned in the response from a previous call that may be used to continue listing with the next page of results."
        },
        {
          "name": "uploadsPerPage",
          "required": false,
          "type": "Int32?",
          "description": "The number of uploads to return per page.  Defaults to 100."
        }
      ],
      "return": {
        "type": "ListUploadsResponse2",
        "description": "A <see cref=\"T:PicMeApi.ListUploadsResponse2\" /> containing the response."
      }
    },
    {
      "name": "DeleteAllUploads",
      "httpMethod": "DELETE",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/upload",
      "subPathPattern": "/collection/{collectionId}/upload",
      "summary": "Deletes all uploads from a collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.Delete\" /> participation rights on the collection.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection whose uploads are to be deleted."
        }
      ],
      "return": {
        "type": "DeleteAllUploadsResponse2",
        "description": "A <see cref=\"T:PicMeApi.DeleteAllUploadsResponse2\" /> containing the response."
      }
    },
    {
      "name": "RevokeRights",
      "httpMethod": "DELETE",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/rights",
      "subPathPattern": "/collection/{collectionId}/rights",
      "summary": "Revokes rights to a collection that were previously granted to a user by a Link (probably through a Invite code).\n            The caller may be the owner, and may specify the user whose rights should be revoked,\n            or the caller may be the user who wants their own rights to the collection revoked.\n            Does *not* revoke inherited rights (rights granted on a parent collection).",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection for which rights should be revoked."
        },
        {
          "name": "userId",
          "required": true,
          "type": "UserId",
          "description": "The <see cref=\"T:AmbientServices.UserId\" /> of the user whose rights are to be revoked."
        }
      ],
      "return": {
        "type": "RevokeRightsResponse2",
        "description": "A <see cref=\"T:PicMeApi.RevokeRightsResponse2\" /> containing the metadata for the new Invite code."
      }
    },
    {
      "name": "ModifyRights",
      "httpMethod": "PUT",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/rights",
      "subPathPattern": "/collection/{collectionId}/rights",
      "summary": "Modifies existing rights to a collection that were previously granted to a user by a Link (probably through a Invite code, but possibly also by a previous call to this API).\n            Can only modify rights directly on the specified collection.  Rights on a parent collection will not be affected.\n            The caller is usually the owner, who must specify the user whose rights should be modified,\n            or the caller may be the user who wants to reduce their own rights to the collection (but not revoke them entirely).",
      "description": "Pass <paramref name=\"newRights\" /> to update <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> (upload/guest participation), or <paramref name=\"newCollectionRights\" /> to update\n            <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> on the collection record (metadata such as rename), or both. Omitted parameters leave that link type unchanged.\n            If <paramref name=\"newCombinedRights\" /> is specified, it takes precedence over <paramref name=\"newRights\" />, <paramref name=\"newCollectionRights\" />, and <paramref name=\"newSubcollectionRights\" /> and replaces the full packed <see cref=\"T:AmbientServices.CollectionRights\" /> before masking by what the caller is allowed to grant.\n            At least one of the four inputs must be non-null. Values are masked by what the caller is allowed to grant.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection for which rights should be modified."
        },
        {
          "name": "userId",
          "required": true,
          "type": "UserId",
          "description": "The <see cref=\"T:AmbientServices.UserId\" /> of the user whose rights are to be modified (the ID of the current user if modifying their own rights)."
        },
        {
          "name": "newRights",
          "required": false,
          "type": "Rights?",
          "description": "A set of <see cref=\"T:AmbientServices.Rights\" /> that should be granted, or null to leave these rights alone.  If the user is not does not have rights to add rights and they are modifying their own rights, any specified rights beyond their currently-granted rights will be ignored."
        },
        {
          "name": "newCollectionRights",
          "required": false,
          "type": "Rights?",
          "description": "A set of <see cref=\"T:AmbientServices.Rights\" /> that should be granted on the collection record itself, or null to leave these rights alone.  If the user is not does not have rights to add rights and they are modifying their own rights, any specified rights beyond their currently-granted rights will be ignored."
        },
        {
          "name": "newSubcollectionRights",
          "required": false,
          "type": "Rights?",
          "description": "A set of <see cref=\"T:AmbientServices.Rights\" /> that should be granted on subcollections, or null to leave these rights alone.  If the user is not does not have rights to add rights and they are modifying their own rights, any specified rights beyond their currently-granted rights will be ignored."
        },
        {
          "name": "newCombinedRights",
          "required": false,
          "type": "CollectionRights?",
          "description": "When not null, the full packed <see cref=\"T:AmbientServices.CollectionRights\" /> to apply (same encoding as stored on <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> links). Takes precedence over <paramref name=\"newRights\" />, <paramref name=\"newCollectionRights\" />, and <paramref name=\"newSubcollectionRights\" />."
        }
      ],
      "return": {
        "type": "ModifyRightsResponse",
        "description": "A <see cref=\"T:PicMeApi.ModifyRightsResponse\" /> containing the response."
      }
    },
    {
      "name": "PatchRights",
      "httpMethod": "PATCH",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)/rights",
      "subPathPattern": "/collection/{collectionId}/rights",
      "summary": "Patches rights to a collection for multiple users, either for the entire collection or the subset of users that were granted rights through a specified invitation.\n            The caller must be the collection owner.  Note that if the user gained rights to a subcollection using the specified invite code, they will not be modified by this call.\n            You can iterate through the descendant collections to modify rights for all users in the collection hierarchy.\n            Only <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> links whose secondary is this collection are considered and updated.\n            When <paramref name=\"combinedRightsMask\" /> is not <see cref=\"F:AmbientServices.CollectionRights.None\" />, the packed link is updated with that mask and <paramref name=\"newCombinedRights\" />, and the separate <see cref=\"T:AmbientServices.Rights\" /> mask parameters are ignored.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection for which rights should be modified."
        },
        {
          "name": "rightsMask",
          "required": true,
          "type": "Rights",
          "description": "Bits to replace on <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> links; use <see cref=\"F:AmbientServices.Rights.None\" /> to skip participation updates."
        },
        {
          "name": "newRights",
          "required": true,
          "type": "Rights",
          "description": "Bits merged into participation rights where <paramref name=\"rightsMask\" /> is set."
        },
        {
          "name": "collectionRightsMask",
          "required": true,
          "type": "Rights",
          "description": "Bits to replace on <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> links for the collection record; use <see cref=\"F:AmbientServices.Rights.None\" /> to skip record-level updates."
        },
        {
          "name": "newCollectionRights",
          "required": true,
          "type": "Rights",
          "description": "Bits merged into record-level rights where <paramref name=\"collectionRightsMask\" /> is set."
        },
        {
          "name": "subcollectionRightsMask",
          "required": false,
          "type": "Rights",
          "description": "Bits to replace on <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> links for the subcollections; use <see cref=\"F:AmbientServices.Rights.None\" /> to skip record-level updates."
        },
        {
          "name": "newSubcollectionRights",
          "required": false,
          "type": "Rights",
          "description": "Bits merged into subcollection rights where <paramref name=\"subcollectionRightsMask\" /> is set."
        },
        {
          "name": "combinedRightsMask",
          "required": false,
          "type": "CollectionRights",
          "description": "When not <see cref=\"F:AmbientServices.CollectionRights.None\" />, bits to replace on the packed <see cref=\"T:AmbientServices.CollectionRights\" /> link; use <see cref=\"F:AmbientServices.CollectionRights.None\" /> to skip. Takes precedence over the separate mask parameters."
        },
        {
          "name": "newCombinedRights",
          "required": false,
          "type": "CollectionRights",
          "description": "Bits merged into the packed link where <paramref name=\"combinedRightsMask\" /> is set."
        },
        {
          "name": "inviteCodeId",
          "required": false,
          "type": "InviteCodeId?",
          "description": "An optional <see cref=\"T:AmbientServices.InviteCodeId\" /> of the invitation whose users rights should all be modified).  If not specified, modifies the rights for all users."
        }
      ],
      "return": {
        "type": "PatchRightsResponse",
        "description": "A <see cref=\"T:PicMeApi.PatchRightsResponse\" /> containing updated <see cref=\"T:PicMeApi.CollectionUserData\" /> for each user whose links were changed."
      }
    },
    {
      "name": "GetCollectionRights",
      "httpMethod": "GET",
      "httpPathRegex": "^/collectionRights/(?<collectionId>[^?/&]+)",
      "subPathPattern": "/collectionRights/{collectionId}",
      "summary": "Gets the rights the calling user has on the collection.\n            The returned <see cref=\"P:PicMeApi.GetCollectionRightsResponse2.CombinedRights\" /> is the packed <see cref=\"T:AmbientServices.CollectionRights\" /> equivalent to the three decoded <see cref=\"T:AmbientServices.Rights\" /> channels.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> whose rights are desired."
        },
        {
          "name": "targetUserId",
          "required": false,
          "type": "UserId?",
          "description": "The <see cref=\"T:AmbientServices.UserId\" /> of a user other than the caller whose rights are desired.  Ignored except for site administrators."
        }
      ],
      "return": {
        "type": "GetCollectionRightsResponse2",
        "description": "A <see cref=\"T:PicMeApi.GetCollectionRightsResponse2\" /> containing the requested information."
      }
    },
    {
      "name": "GetCollectionStats",
      "httpMethod": "GET",
      "httpPathRegex": "^/collection-stats/(?<collectionId>[^?/&]+)",
      "subPathPattern": "/collection-stats/{collectionId}",
      "summary": "Gets the stats for the collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.List\" /> participation rights on the collection uploads.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection whose uploads are desired."
        },
        {
          "name": "userId",
          "required": false,
          "type": "UserId?",
          "description": "An optional <see cref=\"T:AmbientServices.UserId\" /> whose downloads are to be counted.  If not specified, the authenticated user will be counted."
        }
      ],
      "return": {
        "type": "GetCollectionStatsResponse",
        "description": "A <see cref=\"T:PicMeApi.GetCollectionStatsResponse\" /> containing the response."
      }
    },
    {
      "name": "ListChildCollections",
      "httpMethod": "GET",
      "httpPathRegex": "^/hierarchy/(?<parentCollectionId>[^?/&]+)",
      "subPathPattern": "/hierarchy/{parentCollectionId}",
      "summary": "Lists the child collections of a specified parent collection.\n            Must have some kind of access to the parent collection.",
      "parameters": [
        {
          "name": "parentCollectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> indicating which collection is the parent collection."
        }
      ],
      "return": {
        "type": "ListChildCollectionsResponse",
        "description": "A <see cref=\"T:PicMeApi.ListChildCollectionsResponse\" /> containing the requested data."
      }
    },
    {
      "name": "LinkChildCollection",
      "httpMethod": "POST",
      "httpPathRegex": "^/hierarchy/(?<parentCollectionId>[^?/&]+)",
      "subPathPattern": "/hierarchy/{parentCollectionId}",
      "summary": "Links a child collection to a parent, removing any previous link.  \n            Circular references are not allowed.\n            Depth is limited to 4 levels of collections total.\n            The number of children is limited.\n            The caller must own both collections, or have <see cref=\"F:AmbientServices.CollectionRights.SubcollectionCreate\" /> on the parent\n            and own the child or have <see cref=\"F:AmbientServices.CollectionRights.CollectionUpdate\" /> on the child.",
      "parameters": [
        {
          "name": "parentCollectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> indicating which collection is the parent collection."
        },
        {
          "name": "childCollectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> indicating which collection is the child collection."
        }
      ],
      "return": {
        "type": "LinkChildCollectionResponse",
        "description": "A <see cref=\"T:PicMeApi.LinkChildCollectionResponse\" /> containing the requested data."
      }
    },
    {
      "name": "UnlinkChildCollection",
      "httpMethod": "DELETE",
      "httpPathRegex": "^/hierarchy/(?<parentCollectionId>[^?/&]+)",
      "subPathPattern": "/hierarchy/{parentCollectionId}",
      "summary": "Unlinks a child collection from a parent.\n            The caller must own both collections, or have <see cref=\"F:AmbientServices.CollectionRights.SubcollectionDelete\" /> on the parent\n            and own the child or have <see cref=\"F:AmbientServices.CollectionRights.CollectionUpdate\" /> on the child.",
      "parameters": [
        {
          "name": "parentCollectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> indicating which collection is the parent collection."
        },
        {
          "name": "childCollectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> indicating which collection is the child collection."
        }
      ],
      "return": {
        "type": "UnlinkChildCollectionResponse",
        "description": "A <see cref=\"T:PicMeApi.UnlinkChildCollectionResponse\" /> containing the requested data."
      }
    },
    {
      "name": "ListUploaderUsers",
      "httpMethod": "GET",
      "httpPathRegex": "^/uploader-users/(?<collectionId>[^?/&]+)",
      "subPathPattern": "/uploader-users/{collectionId}",
      "summary": "Lists all users that have uploaded anything (currently existing) to the specified collection.\n            Requires participation in the collection.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection whose links are wanted."
        }
      ],
      "return": {
        "type": "ListUploaderUsersResponse",
        "description": "A <see cref=\"T:PicMeApi.ListUploaderUsersResponse\" /> containing the response."
      }
    },
    {
      "name": "ListParentCollections",
      "httpMethod": "GET",
      "httpPathRegex": "^/parents/(?<childCollectionId>[^?/&]+)",
      "subPathPattern": "/parents/{childCollectionId}",
      "summary": "Lists the parent collections of a specified child collection.\n            Must have some kind of access to the child collection.",
      "parameters": [
        {
          "name": "childCollectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> indicating which collection is the child collection."
        }
      ],
      "return": {
        "type": "ListParentCollectionsResponse",
        "description": "A <see cref=\"T:PicMeApi.ListParentCollectionsResponse\" /> containing the requested data."
      }
    },
    {
      "name": "GetCollection",
      "httpMethod": "GET",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)",
      "subPathPattern": "/collection/{collectionId}",
      "summary": "Gets information about the specified collection.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the desired collection."
        }
      ],
      "return": {
        "type": "GetCollectionResponse2",
        "description": "A <see cref=\"T:PicMeApi.GetCollectionResponse2\" /> with the desired data."
      }
    },
    {
      "name": "PatchCollection",
      "httpMethod": "PATCH",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)",
      "subPathPattern": "/collection/{collectionId}",
      "summary": "Patches an existing collection.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection to be patched."
        },
        {
          "name": "body",
          "required": true,
          "type": "Collection",
          "partial": true,
          "description": "The partial <see cref=\"T:PicMeModel.Collection\" /> data from the request body."
        }
      ],
      "return": {
        "type": "PatchCollectionResponse2",
        "description": "A <see cref=\"T:PicMeApi.PatchCollectionResponse2\" /> containing the response data."
      }
    },
    {
      "name": "DeleteCollection",
      "httpMethod": "DELETE",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)",
      "subPathPattern": "/collection/{collectionId}",
      "summary": "Deletes a collection and all descendant collections.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> to be deleted."
        }
      ],
      "return": {
        "type": "DeleteCollectionResponse2",
        "description": "A <see cref=\"T:PicMeApi.DeleteCollectionResponse2\" /> containing the requested data."
      }
    },
    {
      "name": "RestoreDeletedCollection",
      "httpMethod": "POST",
      "httpPathRegex": "^/collection/(?<collectionId>[^?/&]+)",
      "subPathPattern": "/collection/{collectionId}",
      "summary": "Restores a collection granting rights back to the caller.\n            Does *NOT* restore descendant collections, invite codes, cover photos, etc.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> to be restored."
        }
      ],
      "return": {
        "type": "RestoreDeletedCollectionResponse",
        "description": "A <see cref=\"T:PicMeApi.RestoreDeletedCollectionResponse\" /> containing the requested data."
      }
    },
    {
      "name": "ListUsers",
      "httpMethod": "GET",
      "httpPathRegex": "^/users/(?<collectionId>[^?/&]+)",
      "subPathPattern": "/users/{collectionId}",
      "summary": "Lists users that have access to the specified collection (both owners and participants).\n            Requires <see cref=\"F:AmbientServices.CollectionRights.CollectionShareWithOthers\" /> rights.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection whose links are wanted."
        }
      ],
      "return": {
        "type": "ListUsersResponse2",
        "description": "A <see cref=\"T:PicMeApi.ListUsersResponse2\" /> containing the response."
      }
    },
    {
      "name": "BulkCollectionsFromCsv",
      "httpMethod": "POST",
      "httpPathRegex": "^/collections/bulkFromCsv",
      "subPathPattern": "/collections/bulkFromCsv",
      "summary": "Creates or updates a hierarchy of collections and linked invitations from a CSV payload.\n            The first non-empty row must be a header naming at least <c>parent_collection_name</c> and <c>collection_name</c> (any order; case-insensitive).\n            For the original format, also include <c>invite_name</c> and <c>participation_rights</c>.\n            A compact two-column format (parent + collection only) pairs with optional query parameter <paramref name=\"invitationsCsv\" /> for per-level invitations (see below).\n            Data uses those headers to locate columns (extra columns are ignored).\n            Parent and collection matching consider only collections the caller <em>owns</em>; the import snapshots that owned set once and updates it as new collections are created in the same request.\n            participation_rights is numeric or pipe-separated CollectionRights flags.\n            When <paramref name=\"ownerPaysForDownloads\" /> is true, newly created collections in this request receive <see cref=\"F:PicMeModel.CollectionFeatureFlags.OwnerPaysForDownloads\" />; existing collections are unchanged.\n            When <paramref name=\"invitationsCsv\" /> is provided (URL-encoded CSV text, typically passed as a query string), each non-header row defines invites applied to every imported collection whose hierarchy depth matches <c>collection_level</c> (root collections are level 0).\n            Level-based invites are applied in addition to row invites from the primary CSV when that CSV includes invite columns.\n            Response includes summaries plus the collections and invitations touched by the import.\n            The HTTP body is raw UTF-8 CSV; <see cref=\"P:AmbientServices.TypedStream.ContentType\" /> must be a CSV-related media type.",
      "parameters": [
        {
          "name": "body",
          "required": true,
          "type": "TypedStream"
        },
        {
          "name": "ownerPaysForDownloads",
          "required": false,
          "type": "Boolean"
        },
        {
          "name": "invitationsCsv",
          "required": false,
          "type": "Text?"
        }
      ],
      "return": {
        "type": "BulkCollectionsFromCsvResponse"
      }
    },
    {
      "name": "ListAllDeletedUploadDetails",
      "httpMethod": "GET",
      "httpPathRegex": "^/deletedUploadDetails",
      "subPathPattern": "/deletedUploadDetails",
      "summary": "Lists details for deleted uploads in a collection.\n            Requires <see cref=\"F:AmbientServices.CollectionRights.Delete\" /> and <see cref=\"F:AmbientServices.CollectionRights.List\" /> participation rights on the collection.",
      "parameters": [
        {
          "name": "userId",
          "required": false,
          "type": "UserId?",
          "description": "The <see cref=\"T:AmbientServices.UserId\" /> to use (ignored if not a root administrator), or null to use the currently-authenticated user."
        },
        {
          "name": "continuation",
          "required": false,
          "type": "String?",
          "description": "An optional continuation from a previous call that will continue the listing where the previous listing ended."
        },
        {
          "name": "uploadsPerPage",
          "required": false,
          "type": "Int32?",
          "description": "The maximum number of uploads to return."
        }
      ],
      "return": {
        "type": "ListAllDeletedUploadDetailsResponse",
        "description": "A <see cref=\"T:PicMeApi.ListAllDeletedUploadDetailsResponse\" /> containing the results."
      }
    },
    {
      "name": "GetUserStatsDetails",
      "httpMethod": "GET",
      "httpPathRegex": "^/user-stats-details",
      "subPathPattern": "/user-stats-details",
      "summary": "Gets detailed stats for the user.",
      "parameters": [
        {
          "name": "userId",
          "required": false,
          "type": "UserId?",
          "description": "The <see cref=\"T:AmbientServices.UserId\" /> of the user to check (or null to use the currently-authenticated user)."
        },
        {
          "name": "excludeEmptyCollections",
          "required": false,
          "type": "Boolean",
          "description": "Whether to exclude collections with no uploads from the returned stats.  Defaults to false."
        }
      ],
      "return": {
        "type": "GetUserStatsDetailsResponse",
        "description": "A <see cref=\"T:PicMeApi.GetUserStatsDetailsResponse\" /> containing the requested data."
      }
    },
    {
      "name": "GetCollectionLimits",
      "httpMethod": "GET",
      "httpPathRegex": "^/collection-limits",
      "subPathPattern": "/collection-limits",
      "summary": "Gets the specified user's limits, based on the default free subscription or the user's current paid subscription.",
      "parameters": [
        {
          "name": "collectionId",
          "required": true,
          "type": "CollectionId",
          "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the collection whose limits are wanted."
        }
      ],
      "return": {
        "type": "GetCollectionLimitsResponse",
        "description": "A <see cref=\"T:PicMeApi.GetCollectionLimitsResponse\" /> containing the response."
      }
    },
    {
      "name": "ListAllCollectionUsers",
      "httpMethod": "GET",
      "httpPathRegex": "^/collection-users",
      "subPathPattern": "/collection-users",
      "summary": "Lists other users of all collections the authenticated user owns, with their info and rights.  \n            Does not list the owner themselves.",
      "parameters": [
        {
          "name": "forUserId",
          "required": false,
          "type": "UserId?",
          "description": "An optional <see cref=\"T:AmbientServices.UserId\" /> whose collections will be listed.  If specified, the caller must be a root administrator."
        }
      ],
      "return": {
        "type": "ListAllCollectionUsersResponse",
        "description": "A <see cref=\"T:PicMeApi.ListAllCollectionUsersResponse\" /> containing the requested information."
      }
    },
    {
      "name": "ListAllDeletedUploads",
      "httpMethod": "GET",
      "httpPathRegex": "^/deletedUpload",
      "subPathPattern": "/deletedUpload",
      "summary": "Lists deleted uploads in all colletions owned by the specified user.",
      "parameters": [
        {
          "name": "userId",
          "required": false,
          "type": "UserId?",
          "description": "The <see cref=\"T:AmbientServices.UserId\" /> to use (ignored if not a root administrator), or null to use the currently-authenticated user."
        },
        {
          "name": "continuation",
          "required": false,
          "type": "String?",
          "description": "An optional continuation from a previous call that will continue the listing where the previous listing ended."
        },
        {
          "name": "uploadsPerPage",
          "required": false,
          "type": "Int32?",
          "description": "The maximum number of uploads to return."
        }
      ],
      "return": {
        "type": "ListAllDeletedUploadsResponse",
        "description": "A <see cref=\"T:PicMeApi.ListAllDeletedUploadsResponse\" /> containing the results."
      }
    },
    {
      "name": "CreateSharingInviteCode",
      "httpMethod": "POST",
      "httpPathRegex": "^/sharingInvite",
      "subPathPattern": "/sharingInvite",
      "status": "deprecated",
      "notes": "Use InvitationHandler.CreateInviteCode",
      "summary": "Creates a Invite code object for requesting uploads to a collection.\n            The Invite code will be owned by the calling user and will be hierarchically linked to the specified collection.\n            The link type for the activated link is <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> with a link relationship of type <see cref=\"T:AmbientServices.CollectionRights\" />.",
      "parameters": [
        {
          "name": "collectionGlobalId",
          "required": true,
          "type": "RecordGlobalId",
          "description": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the collection for which an upload request Invite code is desired."
        },
        {
          "name": "name",
          "required": true,
          "type": "String",
          "description": "A name for the Invite code, which might be something that describes the rights being granted."
        },
        {
          "name": "clientInformation",
          "required": true,
          "type": "String",
          "description": "A client-controlled string containing any information not otherwise in the Invite code that is needed by the client to render a good Invite Code landing page and post-activation page."
        },
        {
          "name": "rightsToOtherUsersUploads",
          "required": true,
          "type": "CollectionRights",
          "description": "A <see cref=\"T:AmbientServices.CollectionRights\" /> value indicating what rights the user who activates the Invite code will have on other users' uploads."
        }
      ],
      "return": {
        "type": "CreateInviteCodeResponse",
        "description": "A <see cref=\"T:PicMeModel.CreateInviteCodeResponse\" /> containing the metadata for the new Invite code."
      }
    },
    {
      "name": "CreateCollection",
      "httpMethod": "POST",
      "httpPathRegex": "^/collection",
      "subPathPattern": "/collection",
      "summary": "Creates a new collection.",
      "parameters": [
        {
          "name": "body",
          "required": true,
          "type": "Collection",
          "partial": true,
          "description": "The partial <see cref=\"T:PicMeModel.Collection\" /> data from the request body."
        }
      ],
      "return": {
        "type": "CreateCollectionResponse2",
        "description": "A <see cref=\"T:PicMeApi.CreateCollectionResponse2\" /> containing the response data."
      }
    },
    {
      "name": "ListCollections",
      "httpMethod": "GET",
      "httpPathRegex": "^/collection",
      "subPathPattern": "/collection",
      "summary": "Lists collections the authenticated user owns or has access to.",
      "parameters": [
        {
          "name": "filterQuery",
          "required": false,
          "type": "CollectionQuery?",
          "description": "An optional <see cref=\"T:PicMeModel.CollectionQuery\" /> indicating attributes of the collections to be listed."
        },
        {
          "name": "itemsPerPage",
          "required": false,
          "type": "Int32",
          "description": "The number of items to list per page."
        },
        {
          "name": "continuation",
          "required": false,
          "type": "String?",
          "description": "A string from the previous call that will allow the caller to continue listing where the previous call left off."
        },
        {
          "name": "forUserId",
          "required": false,
          "type": "UserId?",
          "description": "An optional <see cref=\"T:AmbientServices.UserId\" /> whose collections will be listed.  If specified, the caller must be a root administrator."
        },
        {
          "name": "includeChildren",
          "required": false,
          "type": "Boolean",
          "description": "Whether to include child collections or not (defaults to false)."
        },
        {
          "name": "includeChildLists",
          "required": false,
          "type": "Boolean",
          "description": "Whether to include lists of children (defaults to false)."
        }
      ],
      "return": {
        "type": "ListCollectionsResponse2",
        "description": "A <see cref=\"T:PicMeApi.ListCollectionsResponse2\" /> containing the requested information."
      }
    },
    {
      "name": "GetUserStats",
      "httpMethod": "GET",
      "httpPathRegex": "^/user-stats",
      "subPathPattern": "/user-stats",
      "summary": "Gets stats for the user.",
      "parameters": [
        {
          "name": "userId",
          "required": false,
          "type": "UserId?",
          "description": "The <see cref=\"T:AmbientServices.UserId\" /> of the user to check (or null to use the currently-authenticated user)."
        }
      ],
      "return": {
        "type": "GetUserStatsResponse",
        "description": "A <see cref=\"T:PicMeApi.GetUserStatsResponse\" /> containing the requested data."
      }
    },
    {
      "name": "ListDownloadRecords",
      "httpMethod": "GET",
      "httpPathRegex": "^/dl",
      "subPathPattern": "/dl",
      "summary": "Lists all download records that match the specified criteria.",
      "parameters": [
        {
          "name": "year",
          "required": true,
          "type": "Int32",
          "description": "The year to get records for."
        },
        {
          "name": "month",
          "required": true,
          "type": "Int32",
          "description": "The month to get records for."
        },
        {
          "name": "day",
          "required": false,
          "type": "Int32",
          "description": "The day to get records for (if not specified, gets records for the entire month)."
        },
        {
          "name": "collectionId",
          "required": false,
          "type": "CollectionId?",
          "description": "The optional <see cref=\"T:PicMeModel.CollectionId\" /> for the collection whose links are wanted."
        },
        {
          "name": "userId",
          "required": false,
          "type": "UserId?",
          "description": "The optional <see cref=\"T:AmbientServices.UserId\" /> for the user whose records are wanted."
        }
      ],
      "return": {
        "type": "ListDownloadRecordsResponse",
        "description": "A <see cref=\"T:PicMeApi.ListDownloadRecordsResponse\" /> containing the response."
      }
    }
  ],
  "types": [
    {
      "name": "CollectionId",
      "summary": "A struct that holds a PicMe collection id.",
      "type": "proxy",
      "representedBy": "String"
    },
    {
      "name": "UploadId",
      "summary": "A struct that holds a PicMe upload id.  A collection id is required for this to uniquely identify a upload.",
      "type": "proxy",
      "representedBy": "String"
    },
    {
      "name": "TrackedDownloadType",
      "summary": "An enumeration of tracked download types.",
      "type": "enum",
      "flags": false,
      "enumValues": [
        {
          "name": "Thumbnail",
          "summary": "The thumbnail was downloaded (probably not tracked).",
          "value": 0
        },
        {
          "name": "View",
          "summary": "The view was downloaded (probably tracked).",
          "value": 1
        },
        {
          "name": "Details",
          "summary": "The original was downloaded (definitely tracked).",
          "value": 2
        },
        {
          "name": "Zip",
          "summary": "A zip was downloaded (definitely tracked).",
          "value": 3
        }
      ]
    },
    {
      "name": "RedirectResponse",
      "summary": "A special response type to use for an API that causes the framework code to respond with an HTTP redirect.  \n            This type and the properties within it are never actually returned to callers.\n            The caller will recieve a standard HTTP redirect response with a 30? redirect code and a \"Location\" header containing the location this API has redirected you to.\n            May also be thrown internally for conditional redirection.",
      "type": "proxy",
      "representedBy": "HttpRedirect"
    },
    {
      "name": "HttpRedirect",
      "summary": "An HTTP response containing a redirect HTTP status response code and a \"Location\" header with a new location for the resource.",
      "type": "composite",
      "members": [
        {
          "name": "location",
          "type": "Uri",
          "summary": "The new location."
        }
      ]
    },
    {
      "name": "GetDeletedUploadResponse2",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.GetDeletedUpload(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,System.Uri,AmbientServices.AuthToken,PicMeModel.CollectionId,PicMeModel.UploadId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "upload",
          "type": "Upload",
          "summary": "The <see cref=\"P:PicMeApi.GetDeletedUploadResponse2.Upload\" /> containing the metadata for the upload."
        },
        {
          "name": "getThumbnailUri",
          "type": "Uri",
          "summary": "A <see cref=\"T:System.Uri\" /> that can be used to get the thumbnail version of the upload, which is the last asynchronous processing to be completed for an upload."
        },
        {
          "name": "getDetailsUri",
          "type": "Uri",
          "summary": "A <see cref=\"T:System.Uri\" /> that can be used to get the details version of the upload, which will be either a thumbnail version, or the original version, depending on the user's plan, the collection's plan, and unlocking selections the collection owner may have made."
        }
      ]
    },
    {
      "name": "LinkRelationshipType",
      "summary": "A record that holds a link relationship type string.\n            Link type strings can contain anything except for slash characters.",
      "type": "proxy",
      "representedBy": "String",
      "enumValues": [
        {
          "name": "Ownership",
          "summary": "Gets the <see cref=\"T:AmbientServices.LinkRelationshipType\" /> for an ownership relationship.\n            This link type indicates that the primary entity owns (or co-owns) the secondary entity.\n            The <see cref=\"T:AmbientServices.LinkRelationship\" /> for this link type is a value obtained from <see cref=\"M:AmbientServices.LinkRelationship.FromEnum``1(``0)\" /> where the <see cref=\"P:AmbientServices.LinkRelationshipType.Ownership\" /> enumeration is the value.",
          "value": "o"
        },
        {
          "name": "Rights",
          "summary": "Gets the <see cref=\"T:AmbientServices.LinkRelationshipType\" /> for a rights relationship indicating what rights the primary entity has on the <strong>secondary entity record itself</strong> (the metadata object), not on nested or associated content.\n            The <see cref=\"T:AmbientServices.LinkRelationship\" /> for this link type is a value obtained from <see cref=\"M:AmbientServices.LinkRelationship.FromEnum``1(``0)\" /> where the <see cref=\"T:AmbientServices.Rights\" /> enumeration is the value.",
          "value": "?"
        },
        {
          "name": "ParticipationRights",
          "summary": "Gets the <see cref=\"T:AmbientServices.LinkRelationshipType\" /> for a collection rights relationship: rights the primary entity has on a collection and the related objects.\n            The <see cref=\"T:AmbientServices.LinkRelationship\" /> for this link type is a value obtained from <see cref=\"M:AmbientServices.LinkRelationship.FromEnum``1(``0)\" /> where the <see cref=\"T:AmbientServices.CollectionRights\" /> enumeration is the value.",
          "description": "For a <c>Collection</c> as secondary, this governs participation in the collection as a guest: \n            listing (<see cref=\"F:AmbientServices.CollectionRights.List\" />), reading others' uploads (<see cref=\"F:AmbientServices.CollectionRights.Read\" />), creating uploads (<see cref=\"F:AmbientServices.CollectionRights.Create\" />), updating upload names (<see cref=\"F:AmbientServices.CollectionRights.Update\" />), and deleting uploads (<see cref=\"F:AmbientServices.CollectionRights.Delete\" />) when the API checks participation rights on the collection.\n            Extended flags support rights on the collection itself and on subcollections.",
          "value": "\u00BF"
        },
        {
          "name": "Hierarchy",
          "summary": "Gets the <see cref=\"T:AmbientServices.LinkRelationshipType\" /> for a hierarchical relationship, for example folders within folders.\n            The entity types don't necessarily have to be the same.  The hierarchy could indicate collections or other objects under a user.\n            The <see cref=\"T:AmbientServices.LinkRelationship\" /> for this link type is currently undefined.  Any relationship indicates that the secondary object is a child of the parent object.",
          "value": "i,\u2534"
        },
        {
          "name": "Map",
          "summary": "Gets the <see cref=\"T:AmbientServices.LinkRelationshipType\" /> for a mapping relationship, for example mapping an external identifier to a local object.\n            The <see cref=\"T:AmbientServices.LinkRelationship\" /> for this link type is currently undefined.  Any relationship indicates that the secondary object is the object identified by the external identifier.",
          "value": "\u22B6"
        }
      ]
    },
    {
      "name": "ListLinksToResponse2",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.ListLinksTo(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,PicMeApi.AuthData,AmbientServices.LinkRelationshipType,PicMeModel.CollectionId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "links",
          "type": "Link[]",
          "summary": "A list of <see cref=\"T:AmbientServices.Link\" /> objects that represent the links from various entities to this collection.\"/&gt;"
        }
      ]
    },
    {
      "name": "Link",
      "summary": "A record representing a two-way (but directed) link between two entities such as membership in a group, a follower, a friendship, or access to a collection.\n            Links are always tracked bidirectionally, but might not necessarily imply any rights on one direction, being kept bidirectionally only for counting and cleanup purposes.\n            Links are constructed, modified, and destroyed in a way that ensures eventual consistency and durability.\n            Note that links are neither atmoic nor isolated, so it's possible to query and see only one side of the link, and the parts will be immediately visible to everyone at some point during the construction.\n            Links are categorized by <see cref=\"T:AmbientServices.LinkRelationshipType\" />, and the link type may indicate that indexes for a secondary record should be copied into the scope of the primary record.\n            Links use <see cref=\"T:AmbientServices.RecordGlobalId\" /> rather than the various specific IDs because the specific IDs are not always indexed globally, and the may not even be unique (they may only be unique within a specific scope, such as an UploadId within a Collection), but the <see cref=\"T:AmbientServices.RecordGlobalId\" /> is always unique within the database.\n            Links may be used to define ownership of an entity, rights to an entity, or any other relationship between two entities that requires durability and eventual consistency, but the specific semantics of the link relationship should be defined in the documentation for the specific <see cref=\"T:AmbientServices.LinkRelationshipType\" /> being used.",
      "type": "composite",
      "members": [
        {
          "name": "relationshipType",
          "type": "LinkRelationshipType",
          "summary": "A <see cref=\"T:AmbientServices.LinkRelationshipType\" /> that separates this link from other types of links and correlates to a specific set of <see cref=\"T:AmbientServices.LinkRelationship\" />s that are valid for links of this relationshipType.\n            The corresponding <see cref=\"T:AmbientServices.LinkRelationship\" /> or an enum which can be translated to a <see cref=\"T:AmbientServices.LinkRelationship\" /> should be linked in the documentation for the specific <see cref=\"T:AmbientServices.LinkRelationshipType\" />."
        },
        {
          "name": "primary",
          "type": "RecordGlobalId",
          "summary": "A <see cref=\"T:AmbientServices.RecordGlobalId\" /> identifying the primary entity for the link.  The string cannot contain NUL or DEL characters."
        },
        {
          "name": "secondary",
          "type": "RecordGlobalId",
          "summary": "A <see cref=\"T:AmbientServices.RecordGlobalId\" /> identifying the secondary entity for the link.  The string cannot contain NUL or DEL characters."
        },
        {
          "name": "relationship",
          "type": "LinkRelationship",
          "summary": "A <see cref=\"P:AmbientServices.Link.Relationship\" /> indicating the nature of the relationship.  This string may contain multiple parts indicating various rights in one direction, the other direction, or both, but must not contain forward slashes."
        },
        {
          "name": "linkDate",
          "type": "DateTime",
          "summary": "A <see cref=\"T:System.DateTime\" /> indicating when the link was created.\n            Note that this property is *not* considered when comparing <see cref=\"T:AmbientServices.Link\" />s for logical equivalence using <see cref=\"M:AmbientServices.Link.Equals(AmbientServices.Link)\" />."
        },
        {
          "name": "encodedPrimaryPath",
          "type": "FileSystemRelativeFilePath",
          "summary": "Gets the encoded primary link path."
        },
        {
          "name": "encodedSecondaryPath",
          "type": "FileSystemRelativeFilePath",
          "summary": "Gets the encoded secondary link path."
        }
      ]
    },
    {
      "name": "FileSystemRelativeFilePath",
      "summary": "A record that contains a relative file path.  \n            File paths *never* end with a folder separator character.\n            File paths usually have an extension.",
      "type": "proxy",
      "representedBy": "String"
    },
    {
      "name": "LinkRelationship",
      "summary": "A record struct that holds a link type string.\n            Link type strings can contain anything except for slash characters.\n            Link types can be easily converted to or from any enum type using <see cref=\"M:AmbientServices.LinkRelationship.FromEnum``1(``0)\" /> and <see cref=\"M:AmbientServices.LinkRelationship.ToEnum``1\" />.",
      "type": "proxy",
      "representedBy": "String",
      "enumValues": [
        {
          "name": "Default",
          "summary": "Gets the default relationship.",
          "value": ""
        }
      ]
    },
    {
      "name": "DeleteCollectionCoverPhotoResponse2",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.DeleteCollectionCoverPhoto(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,PicMeApi.AuthData,PicMeModel.CollectionId,System.Net.IPAddress)\" /> API."
    },
    {
      "name": "GetUploadResponse2",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.GetUpload(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,System.Uri,AmbientServices.AuthToken,PicMeModel.CollectionId,PicMeModel.UploadId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "upload",
          "type": "Upload",
          "summary": "The <see cref=\"P:PicMeApi.GetUploadResponse2.Upload\" /> containing the metadata for the upload."
        },
        {
          "name": "uploader",
          "type": "UploaderInfo",
          "summary": "A <see cref=\"T:PicMeApi.UploaderInfo\" /> contianing shareable information about the uploader."
        },
        {
          "name": "getThumbnailUri",
          "type": "Uri",
          "summary": "A <see cref=\"T:System.Uri\" /> that can be used to get the thumbnail version of the upload, which is the last asynchronous processing to be completed for an upload."
        },
        {
          "name": "getViewUri",
          "type": "Uri",
          "summary": "A <see cref=\"T:System.Uri\" /> that can be used to get a viewer-appropriate version of the upload, which may be a scaled-down version for locked uploads, or for unlocked uploads, the original, or a scaled-down version that's appropriate for over-the-internet viewing."
        },
        {
          "name": "getDetailsUri",
          "type": "Uri",
          "summary": "A <see cref=\"T:System.Uri\" /> that can be used to get the downloadable version of the upload, which will be either a scaled-down version (for locked uploads) or an exact copy of the original upload (for unlocked uploads)."
        },
        {
          "name": "getDownloadUri",
          "type": "Uri",
          "summary": "A <see cref=\"T:System.Uri\" /> that triggers a browser download with the correct filename using <c>Content-Disposition: attachment</c> needed to control the filename for *some* browsers.\n            Use this URI for \"Download\" buttons to prevent browsers from saving inline-rendered images via the OS MIME registry (which can produce unexpected extensions like .jfif on Windows)."
        }
      ]
    },
    {
      "name": "UploaderInfo",
      "summary": "A record containing shareable information about the uploader.",
      "type": "composite",
      "members": [
        {
          "name": "uploaderUserId",
          "type": "UserId",
          "summary": "The <see cref=\"T:AmbientServices.UserId\" /> of the uploader."
        },
        {
          "name": "uploaderName",
          "type": "String",
          "summary": "The name of the uploader, or empty string if the uploader is not known."
        },
        {
          "name": "getUploaderProfilePicture",
          "type": "Uri?",
          "summary": "An optional <see cref=\"T:System.Uri\" /> containing a link to GET the user's profile picture."
        }
      ]
    },
    {
      "name": "Upload",
      "summary": "A record that holds information about an upload (but not the binary data).\n            All date/times are in UTC unless specifically specified otherwise.",
      "type": "composite",
      "members": [
        {
          "name": "uploadId",
          "type": "UploadId",
          "summary": "The <see cref=\"P:PicMeModel.Upload.UploadId\" /> for this upload.  Ignored as an input."
        },
        {
          "name": "uploadGlobalId",
          "type": "RecordGlobalId",
          "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for this upload.  Ignored as an input."
        },
        {
          "name": "uploadTime",
          "type": "DateTime",
          "summary": "The <see cref=\"T:System.DateTime\" /> when the upload was created (before the binary was uploaded).  Ignored as an input, except for queries."
        },
        {
          "name": "uploadState",
          "type": "UploadState",
          "summary": "The <see cref=\"P:PicMeModel.Upload.UploadState\" /> of the upload.  Ignored as an input, except for queries."
        },
        {
          "name": "uploaderUserId",
          "type": "ActorId",
          "summary": "The <see cref=\"T:AmbientServices.ActorId\" /> of the uploader.  Ignored as an input, except for queries."
        },
        {
          "name": "mimeType",
          "type": "MimeType",
          "summary": "The RFC MIME-type of the originally uploaded binary data."
        },
        {
          "name": "bytes",
          "type": "Int64",
          "summary": "The number of bytes in the upload (as sent by the client, not verified by the server)."
        },
        {
          "name": "originalFilename",
          "type": "String",
          "summary": "The original filename, as it was specified by the uploader."
        },
        {
          "name": "identifiedHash",
          "type": "String",
          "summary": "A hash type followed by the hash value."
        },
        {
          "name": "caption",
          "type": "Text",
          "summary": "A user-specified caption or title for the upload."
        },
        {
          "name": "notes",
          "type": "Text?",
          "summary": "Optional user-specified notes, or a description for the upload."
        },
        {
          "name": "tags",
          "type": "String[]?",
          "summary": "An optional array of strings containing tag identifiers whose mapping to displayable strings is contained in <see cref=\"P:PicMeModel.Collection.TagMap\" />."
        },
        {
          "name": "location",
          "type": "String",
          "summary": "A hash of the uploader's IP address.  Ignored as an input, except for queries."
        },
        {
          "name": "session",
          "type": "String",
          "summary": "The ID of the user session used to upload the file.  Ignored as an input, except for queries."
        },
        {
          "name": "copiedFromCollectionId",
          "type": "CollectionId?",
          "summary": "An optional <see cref=\"T:PicMeModel.CollectionId\" /> in case this upload was copied from another collection.  Ignored as an input, except for queries.  Automatically set during copy operations."
        },
        {
          "name": "copiedFromUploadId",
          "type": "UploadId?",
          "summary": "An optional <see cref=\"P:PicMeModel.Upload.UploadId\" /> in case this upload was copied from another collection.  Ignored as an input, except for queries.  Automatically set during copy operations."
        },
        {
          "name": "originalAvailability",
          "type": "UploadOriginalAvailability",
          "summary": "A <see cref=\"T:PicMeModel.UploadOriginalAvailability\" /> indicating whether or not this upload has been paid for.  Ignored as an input unless specified by an administrator or payment is also specified or when used in a query."
        },
        {
          "name": "blockedReason",
          "type": "String?",
          "summary": "The reason the upload was blocked (if it was blocked)."
        },
        {
          "name": "width",
          "type": "Int32?",
          "summary": "The width of the image (if it is an image).  Ignored as an input, except for queries."
        },
        {
          "name": "height",
          "type": "Int32?",
          "summary": "The height of the image (if it is an image).  Ignored as an input, except for queries."
        },
        {
          "name": "metadata",
          "type": "UploadMetadata?",
          "summary": "An <see cref=\"T:PicMeModel.UploadMetadata\" /> containing metadata either extracted from the image or filled in by the user."
        },
        {
          "name": "sortKey",
          "type": "Tumbler?",
          "summary": "An optional string that indicates how the upload should be sorted for a user-specified arrangement."
        }
      ]
    },
    {
      "name": "Tumbler",
      "summary": "A record that contains a tumbler, a string that allows for user-controlled sorting, \n            such that the ordinally-sorted strings are in the desired order and \n            an algorithm can generate new tumblers that sort between existing tumblers.",
      "description": "If the caller wants to generate new tumblers that sort between two existing tumblers,\n            they will need to implement this algorithm, or at least restrict themselves to the characters that are valid in tumblers.\n            Those characters are: 7-bit ASCII characters excluding NUL, /, and DEL.\n            <see cref=\"P:AmbientServices.Tumbler.MinValue\" /> represents the minimum possible value (which cannot ever be generated through splitting).\n            There is no maximum possible value, because you can always just add another character at the end of any existing tumbler to make one that is greater.\n            If you need to start with a tumbler that is meant as an upper limit, you can use",
      "type": "proxy",
      "representedBy": "String"
    },
    {
      "name": "UploadMetadata",
      "type": "composite",
      "members": [
        {
          "name": "cameraMake",
          "type": "String?",
          "summary": "An optional string containing the camera make."
        },
        {
          "name": "cameraModel",
          "type": "String?",
          "summary": "An optional string containing the camera model."
        },
        {
          "name": "lensMake",
          "type": "String?",
          "summary": "An optional string containing the lens make."
        },
        {
          "name": "lensModel",
          "type": "String?",
          "summary": "An optional string containing the lens model."
        },
        {
          "name": "exposureTime",
          "type": "TimeSpan?",
          "summary": "An optional <see cref=\"T:System.TimeSpan\" /> indicating the exposure time."
        },
        {
          "name": "fStop",
          "type": "Single?",
          "summary": "An optional real number indicating the F-Stop aperture setting."
        },
        {
          "name": "dates",
          "type": "DateTime[]?",
          "summary": "An optional array of <see cref=\"T:System.DateTime\" /> associated with this image (all are searchable)."
        },
        {
          "name": "takenTime",
          "type": "DateTime?",
          "summary": "An optional <see cref=\"T:System.DateTime\" /> indicating when the image was taken."
        },
        {
          "name": "digitizedTime",
          "type": "DateTime?",
          "summary": "An optional <see cref=\"T:System.DateTime\" /> indicating when the image was digitized."
        },
        {
          "name": "subjectLocation",
          "type": "SubjectLocation?",
          "summary": "An optional <see cref=\"P:PicMeModel.UploadMetadata.SubjectLocation\" />s indicating the locations of the primary subjects within the image."
        },
        {
          "name": "orientation",
          "type": "String?",
          "summary": "An optional string indicating the orientation of the image."
        },
        {
          "name": "longitude",
          "type": "Single?",
          "summary": "The optional longitude for the image."
        },
        {
          "name": "latitude",
          "type": "Single?",
          "summary": "The optional latitude for the image."
        }
      ]
    },
    {
      "name": "SubjectLocation",
      "summary": "A record containing the location of a subject within an image.",
      "type": "composite",
      "members": [
        {
          "name": "x1",
          "type": "Single",
          "summary": "The smaller X location as a fraction of the total pixel space."
        },
        {
          "name": "x2",
          "type": "Single",
          "summary": "The larger X location as a fraction of the total pixel space."
        },
        {
          "name": "y1",
          "type": "Single",
          "summary": "The smaller Y location as a fraction of the total pixel space."
        },
        {
          "name": "y2",
          "type": "Single",
          "summary": "The larger Y location as a fraction of the total pixel space."
        }
      ]
    },
    {
      "name": "UploadOriginalAvailability",
      "summary": "An enumeration indicating the availability of the original version of the upload.",
      "type": "enum",
      "flags": false,
      "enumValues": [
        {
          "name": "Locked",
          "summary": "The upload original is locked, so the detail-view version of the upload will be limited in fidelity \n            unless the user or collection plan indicates that upload-by-upload unlocking is not required.",
          "value": 0
        },
        {
          "name": "Unlocked",
          "summary": "The upload has been unlocked, so the full-fidelity version of the original is available.",
          "value": 1
        }
      ]
    },
    {
      "name": "MimeType",
      "summary": "A struct that holds an HTTP MimeType value.",
      "type": "proxy",
      "representedBy": "String"
    },
    {
      "name": "ActorId",
      "summary": "A struct that holds an actor identifier, which identifies either a single user or both an actor (actual) and effective (proxied) user.",
      "type": "proxy",
      "representedBy": "String"
    },
    {
      "name": "UploadState",
      "summary": "An enumeration of possible upload states.",
      "type": "enum",
      "flags": false,
      "enumValues": [
        {
          "name": "Uploading",
          "summary": "The upload has been registered and is probably being uploaded.",
          "value": 0
        },
        {
          "name": "Uploaded",
          "summary": "The upload has been uploaded and is ready for processing.",
          "value": 1
        },
        {
          "name": "Processed",
          "summary": "The upload has been processed and is ready for viewing.",
          "value": 2
        },
        {
          "name": "Error",
          "summary": "There was an error processing the upload.",
          "value": 3
        },
        {
          "name": "Blocked",
          "summary": "The upload has been blocked due to moderation.",
          "value": 4
        },
        {
          "name": "Deleting",
          "summary": "The upload is being deleted.",
          "value": -1
        }
      ]
    },
    {
      "name": "PatchUploadResponse2",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.PatchUpload(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,PicMeApi.AuthData,System.String,System.Net.IPAddress,System.String,PicMeModel.CollectionId,PicMeModel.UploadId,AmbientServices.Partial{PicMeModel.Upload},System.Boolean)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "upload",
          "type": "Upload",
          "summary": "The <see cref=\"P:PicMeApi.PatchUploadResponse2.Upload\" /> that was stored for this upload."
        }
      ]
    },
    {
      "name": "DeleteUploadResponse2",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.DeleteUpload(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,PicMeModel.PicMeGlobalCounters,PicMeApi.AuthData,PicMeModel.CollectionId,PicMeModel.UploadId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "collectionId",
          "type": "CollectionId",
          "summary": "The <see cref=\"P:PicMeApi.DeleteUploadResponse2.CollectionId\" /> of the collection from which the upload was removed."
        },
        {
          "name": "uploadId",
          "type": "UploadId",
          "summary": "The <see cref=\"P:PicMeApi.DeleteUploadResponse2.UploadId\" /> of the upload to delete."
        }
      ]
    },
    {
      "name": "CopyUploadResponse2",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.CopyUpload(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,System.String,System.Net.IPAddress,System.String,System.String,PicMeModel.CollectionId,PicMeModel.UploadId,PicMeModel.CollectionId,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "destinationUpload",
          "type": "Upload",
          "summary": "The <see cref=\"T:PicMeModel.Upload\" /> for the new upload."
        },
        {
          "name": "getDestinationThumbnailUri",
          "type": "Uri",
          "summary": "A <see cref=\"T:System.Uri\" /> for the thumbnail of the new upload, which will be available when the copy is complete."
        }
      ]
    },
    {
      "name": "ListDeletedUploadDetailsResponse",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.ListDeletedUploadDetails(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,PicMeModel.CollectionId,System.String,System.Nullable{System.Int32},System.Boolean,System.Boolean)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "uploadsPerPage",
          "type": "Int32",
          "summary": "The number of uploads to return per page of responses."
        },
        {
          "name": "uploads",
          "type": "UploadDetails[]",
          "summary": "An array of <see cref=\"T:PicMeApi.UploadDetails\" /> for the uploads."
        },
        {
          "name": "uploaders",
          "type": "UploaderInfo[]",
          "summary": "An array containing the information about all the uploaders in this list of upload details."
        },
        {
          "name": "discussionMessageCountInfo",
          "type": "UploadDiscussionMessageCount[]?",
          "summary": "An optional array containing the information about discussion message counts if that information was requested."
        },
        {
          "name": "pollSelectionCountInfo",
          "type": "UploadPollSelectionCount[]?",
          "summary": "An optional array containing the information about poll selection  counts if that information was requested."
        },
        {
          "name": "continuation",
          "type": "String?",
          "summary": "A string that can be passed to a subsequent call in order to continue listing just after this page of results."
        }
      ]
    },
    {
      "name": "UploadPollSelectionCount",
      "summary": "A record containing information about the poll selection count for an upload.",
      "type": "composite",
      "members": [
        {
          "name": "uploadId",
          "type": "UploadId",
          "summary": "The <see cref=\"P:PicMeApi.UploadPollSelectionCount.UploadId\" /> of the upload."
        },
        {
          "name": "pollSelectionCount",
          "type": "Int32",
          "summary": "The number of poll selections for the upload."
        }
      ]
    },
    {
      "name": "UploadDiscussionMessageCount",
      "summary": "A record containing information about the discussion message count for an upload.",
      "type": "composite",
      "members": [
        {
          "name": "uploadId",
          "type": "UploadId",
          "summary": "The <see cref=\"P:PicMeApi.UploadDiscussionMessageCount.UploadId\" /> of the upload."
        },
        {
          "name": "discussionMessageCount",
          "type": "Int32",
          "summary": "The number of discussion messages in the upload."
        }
      ]
    },
    {
      "name": "UploadDetails",
      "summary": "A record containing information about an upload and the uploader.",
      "type": "composite",
      "members": [
        {
          "name": "upload",
          "type": "Upload",
          "summary": "The <see cref=\"P:PicMeApi.UploadDetails.Upload\" /> containing the metadata for the upload."
        },
        {
          "name": "thumbnailUrl",
          "type": "Uri",
          "summary": "The <see cref=\"T:System.Uri\" /> for the thumbnail, which will not exist until the upload is successfully uploaded and processed."
        },
        {
          "name": "uploader",
          "type": "UploaderInfo",
          "summary": "A <see cref=\"T:PicMeApi.UploaderInfo\" /> contianing shareable information about the uploader."
        },
        {
          "name": "dateDeleted",
          "type": "DateTime?",
          "summary": "The <see cref=\"T:System.DateTime\" /> the upload was deleted (if it was deleted)."
        },
        {
          "name": "locked",
          "type": "Boolean",
          "summary": "Whether the upload is locked or not."
        }
      ]
    },
    {
      "name": "GetCollectionModificationStampResponse2",
      "summary": "A record containing a timestamp indicating the last time the collection was modified.",
      "type": "composite",
      "members": [
        {
          "name": "modificationStamp",
          "type": "DateTime?",
          "summary": "The <see cref=\"T:System.DateTime\" /> when the collection was most recently modified, or null if the collection has never been modified."
        }
      ]
    },
    {
      "name": "PutCollectionCoverPhotoResponse",
      "summary": "A record containing a collection cover photo upload Uri.",
      "type": "composite",
      "members": [
        {
          "name": "putCoverPhotoUri",
          "type": "Uri"
        }
      ]
    },
    {
      "name": "UploadCondition",
      "summary": "A Condition that can be used to query for uploads.  Supported conditions can be found in the <see cref=\"T:AmbientServices.ConditionType\" /> enumeration.\n            See https://github.com/lightningkite/lightning-server/blob/version-3/docs/use-as-client.md#rest-endpoints for more details and examples.",
      "type": "composite",
      "members": [
        {
          "name": "conditionType",
          "type": "String"
        },
        {
          "name": "value",
          "type": "Object?"
        },
        {
          "name": "ignoreCase",
          "type": "Boolean?"
        }
      ]
    },
    {
      "name": "Object"
    },
    {
      "name": "ConditionType",
      "summary": "An enumeration of standard condition types.\n            In addition, condition types can be property names.",
      "type": "enum",
      "flags": false,
      "enumValues": [
        {
          "name": "Never",
          "summary": "Never let anything through. (Probably not useful except for testing)",
          "value": 0
        },
        {
          "name": "Always",
          "summary": "Lets everything through.",
          "value": 1
        },
        {
          "name": "And",
          "summary": "Only lets things through if all the conditions in the array are met.\n            Uses Subconditions.",
          "value": 2
        },
        {
          "name": "Or",
          "summary": "Lets things through if any of the conditions in the array are met.\n            Uses Subconditions.",
          "value": 3
        },
        {
          "name": "Equal",
          "summary": "Only let through items that match the given value exactly.\n            Uses a value.",
          "value": 4
        },
        {
          "name": "NotEqual",
          "summary": "Only let through items that do not match the given value exactly.\n            Uses a value.",
          "value": 5
        },
        {
          "name": "Inside",
          "summary": "Only let through items that match one of the given values exactly.\n            Uses an array of values.",
          "value": 6
        },
        {
          "name": "NotInside",
          "summary": "Only let through items that do not match one of the given values exactly.\n            Uses an array of values.",
          "value": 7
        },
        {
          "name": "GreaterThan",
          "summary": "Only let through items that are greater than the given value.\n            Uses a sortable value.",
          "value": 8
        },
        {
          "name": "LessThan",
          "summary": "Only let through items that are less than the given value.\n            Uses a sortable value.",
          "value": 9
        },
        {
          "name": "GreaterThanOrEqual",
          "summary": "Only let through items that are greater than or equal to the given value.\n            Uses a sortable value.",
          "value": 10
        },
        {
          "name": "LessThanOrEqual",
          "summary": "Only let through items that are less than or equal to the given value.\n            Uses a sortable value.",
          "value": 11
        },
        {
          "name": "StringContains",
          "summary": "Only let through items that contain the given string.\n            Uses a string value.",
          "value": 12
        },
        {
          "name": "RegexMatches",
          "summary": "Only let through items that match a regular expression.\n            Uses a regular expression string value.",
          "value": 13
        },
        {
          "name": "ListAllElements",
          "summary": "Only matches lists where every element matches the given condition.",
          "value": 14
        },
        {
          "name": "ListAnyElements",
          "summary": "Only matches lists where at least one element matches the given condition.",
          "value": 15
        },
        {
          "name": "ListSizesEqual",
          "summary": "Only matches lists where the size matches the given count.\n            Uses a count value.",
          "value": 16
        },
        {
          "name": "SetAllElements",
          "summary": "Only matches sets where every element matches the given condition.",
          "value": 17
        },
        {
          "name": "SetAnyElements",
          "summary": "Only matches sets where at least one element matches the given condition.",
          "value": 18
        },
        {
          "name": "SetSizesEqual",
          "summary": "Only matches sets where the size matches the given count.\n            Uses a count value.",
          "value": 19
        },
        {
          "name": "IfNotNull",
          "summary": "Only matches values that are not null.",
          "value": 20
        }
      ]
    },
    {
      "name": "ListUploadDetailsResponse",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.ListUploadDetails(System.String,System.String,AmbientServices.Auth,AmbientServices.Database,AmbientServices.IAmbientAtomicCache,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,PicMeModel.CollectionId,PicMeModel.UploadCondition,System.String,System.Nullable{System.Int32},System.Boolean,System.Boolean,System.String)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "uploadsPerPage",
          "type": "Int32",
          "summary": "The number of uploads to return per page of responses."
        },
        {
          "name": "uploadDetails",
          "type": "UploadDetails[]",
          "summary": "An array of <see cref=\"T:PicMeApi.UploadDetails\" /> for the uploads."
        },
        {
          "name": "uploaders",
          "type": "UploaderInfo[]",
          "summary": "An array containing the information about all the uploaders in this list of upload details."
        },
        {
          "name": "discussionMessageCountInfo",
          "type": "UploadDiscussionMessageCount[]?",
          "summary": "An optional array containing the information about discussion message counts if that information was requested."
        },
        {
          "name": "pollSelectionCountInfo",
          "type": "UploadPollSelectionCount[]?",
          "summary": "An optional array containing the information about poll selection  counts if that information was requested."
        },
        {
          "name": "continuation",
          "type": "String?",
          "summary": "A string that can be passed to a subsequent call in order to continue listing just after this page of results."
        }
      ]
    },
    {
      "name": "ListDeletedUploadsResponse2",
      "summary": "/// A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.ListUploads(System.String,AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,PicMeModel.CollectionId,PicMeModel.UploadCondition,PicMeModel.UploadQuery,System.String,System.Nullable{System.Int32})\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "uploadsPerPage",
          "type": "Int32",
          "summary": "The number of uploads to return per page of responses."
        },
        {
          "name": "uploads",
          "type": "ListedUpload[]",
          "summary": "An array of <see cref=\"T:PicMeApi.ListedUpload\" /> for the uploads."
        },
        {
          "name": "continuation",
          "type": "String?",
          "summary": "A string that can be passed to a subsequent call in order to continue listing just after this page of results."
        }
      ]
    },
    {
      "name": "ListedUpload",
      "summary": "A record containing data about an upload.",
      "type": "composite",
      "members": [
        {
          "name": "uploadId",
          "type": "UploadId",
          "summary": "The <see cref=\"P:PicMeApi.ListedUpload.UploadId\" /> of the upload."
        },
        {
          "name": "uploadGlobalId",
          "type": "RecordGlobalId",
          "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> of the upload."
        },
        {
          "name": "mimeType",
          "type": "MimeType",
          "summary": "The <see cref=\"P:PicMeApi.ListedUpload.MimeType\" /> indicating the type of file the upload contains."
        },
        {
          "name": "thumbnailUrl",
          "type": "Uri",
          "summary": "The <see cref=\"T:System.Uri\" /> for the thumbnail, which will not exist until the upload is successfully uploaded and processed."
        }
      ]
    },
    {
      "name": "RestoreDeletedUploadsResponse2",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.RestoreDeletedUploads(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,PicMeApi.AuthData,PicMeModel.CollectionId,PicMeModel.UploadId[])\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "restoredUploadCount",
          "type": "Int32",
          "summary": "The number of uploads that were restored."
        }
      ]
    },
    {
      "name": "ListUploadKeywordsResponse",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.ListUploadKeywords(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,PicMeApi.AuthData,PicMeModel.CollectionId,System.String,System.String)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "keywords",
          "type": "String[]",
          "summary": "An array of keywords that start with the specified prefix."
        }
      ]
    },
    {
      "name": "GetOrStartPartialZipOfOriginalsResponse2",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.GetOrStartPartialZipOfOriginals(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,PicMeModel.CollectionId,PicMeModel.UploadId[])\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "getZipStatusUri",
          "type": "Uri",
          "summary": "A <see cref=\"T:System.Uri\" /> that can be (temporarily) used to get a JSON file containing information about how the ZIP process is progressing and where to download it."
        }
      ]
    },
    {
      "name": "GetOrStartFullZipOfOriginalsResponse2",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.GetOrStartFullZipOfOriginals(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,PicMeModel.CollectionId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "getZipStatusUri",
          "type": "Uri",
          "summary": "A <see cref=\"T:System.Uri\" /> that can be (temporarily) used to get a JSON file containing information about how the ZIP process is progressing and where to download it."
        }
      ]
    },
    {
      "name": "CreateUploadResponse2",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.CreateUpload(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,System.String,System.Net.IPAddress,System.String,PicMeModel.CollectionId,AmbientServices.Partial{PicMeModel.Upload},System.Boolean,System.Boolean)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "upload",
          "type": "Upload",
          "summary": "The <see cref=\"P:PicMeApi.CreateUploadResponse2.Upload\" /> that was stored for this upload."
        },
        {
          "name": "putOriginalUploadUri",
          "type": "Uri",
          "summary": "A <see cref=\"T:System.Uri\" /> that can be used to upload the binary data for the upload."
        },
        {
          "name": "getThumbnailUri",
          "type": "Uri",
          "summary": "A <see cref=\"T:System.Uri\" /> that can be used to get the thumbnail version of the upload, which is the last asynchronous processing to be completed for an upload."
        }
      ]
    },
    {
      "name": "UploadQuery",
      "summary": "A record that holds information about an upload query.",
      "type": "composite",
      "members": [
        {
          "name": "uploadTimeRange",
          "type": "DateTimeRange?",
          "summary": "An optional <see cref=\"T:AmbientServices.DateTimeRange\" /> indicating the possible range of upload times."
        },
        {
          "name": "uploadState",
          "type": "UploadState?",
          "summary": "An optional <see cref=\"P:PicMeModel.UploadQuery.UploadState\" /> for the desired uploads."
        },
        {
          "name": "uploaderUserId",
          "type": "ActorId?",
          "summary": "An optional <see cref=\"T:AmbientServices.ActorId\" /> for the desired uplaods."
        },
        {
          "name": "mimeType",
          "type": "MimeType?",
          "summary": "An optional RFC MIME-type for the desired uploads."
        },
        {
          "name": "bytesRange",
          "type": "Int64Range?",
          "summary": "An optional <see cref=\"T:AmbientServices.Int64Range\" /> for the desired uploads."
        },
        {
          "name": "originalFilenameKeywords",
          "type": "String?",
          "summary": "An optional space-separated list of words to match the original upload filename for the desired uploads."
        },
        {
          "name": "identifiedHash",
          "type": "String?",
          "summary": "An optional hash to search for."
        },
        {
          "name": "captionKeywords",
          "type": "Text?",
          "summary": "An optional space-separated list of caption keywords to search for."
        },
        {
          "name": "tags",
          "type": "String[]?",
          "summary": "An optional array of required tag identifiers to search for.  See <see cref=\"P:PicMeModel.Collection.TagMap\" />."
        },
        {
          "name": "copiedFromCollectionId",
          "type": "CollectionId?",
          "summary": "An optional <see cref=\"T:PicMeModel.CollectionId\" /> to search for uploads copied from another collection."
        },
        {
          "name": "originalAvailability",
          "type": "UploadOriginalAvailability?",
          "summary": "An optional <see cref=\"T:PicMeModel.UploadOriginalAvailability\" /> to search for."
        },
        {
          "name": "blockedReasonKeywords",
          "type": "String?",
          "summary": "An optional set of keywords to look in the <see cref=\"P:PicMeModel.Upload.BlockedReason\" /> for."
        },
        {
          "name": "isEmpty",
          "type": "Boolean",
          "summary": "Checks to see if anything at all is specified in the query (an empty query will have no filters in it)."
        }
      ]
    },
    {
      "name": "Int64Range",
      "summary": "A struct that holds an Int64 range.  Represented as the lower-bound integer and the upper bound integer separated by two dashes.",
      "type": "proxy",
      "representedBy": "String"
    },
    {
      "name": "DateTimeRange",
      "summary": "A struct that holds a date-time range.  Serialized as the ISO 8601 start and end dates separated by two dashes.",
      "type": "proxy",
      "representedBy": "String"
    },
    {
      "name": "ListUploadsResponse2",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.ListUploads(System.String,AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,PicMeModel.CollectionId,PicMeModel.UploadCondition,PicMeModel.UploadQuery,System.String,System.Nullable{System.Int32})\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "uploadsPerPage",
          "type": "Int32",
          "summary": "The number of uploads to return per page of responses."
        },
        {
          "name": "uploads",
          "type": "ListedUpload[]",
          "summary": "An array of <see cref=\"T:PicMeApi.ListedUpload\" /> for the uploads."
        },
        {
          "name": "continuation",
          "type": "String?",
          "summary": "A string that can be passed to a subsequent call in order to continue listing just after this page of results."
        }
      ]
    },
    {
      "name": "DeleteAllUploadsResponse2",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.DeleteAllUploads(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,PicMeModel.PicMeGlobalCounters,PicMeApi.AuthData,PicMeModel.CollectionId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "collectionId",
          "type": "CollectionId",
          "summary": "The <see cref=\"P:PicMeApi.DeleteAllUploadsResponse2.CollectionId\" /> whose uploads were deleted."
        }
      ]
    },
    {
      "name": "UserId",
      "summary": "A struct that holds a user identifier.",
      "type": "proxy",
      "representedBy": "String"
    },
    {
      "name": "RevokeRightsResponse2",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.RevokeRights(AmbientServices.IFileSystem,AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,PicMeModel.CollectionId,AmbientServices.UserId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "linksDeleted",
          "type": "Int32",
          "summary": "The number of links that were deleted."
        }
      ]
    },
    {
      "name": "Rights",
      "summary": "A multivalued enumeration of rights that may be assigned between entities when they are *not* owned outright.\n            Do not change the names here.  They are converted to character representations based on the names here.",
      "type": "enum",
      "flags": true,
      "enumValues": [
        {
          "name": "None",
          "summary": "The primary entity is not allowed any kind of access to the secondary entity.",
          "value": 0
        },
        {
          "name": "List",
          "summary": "The primary entity is allowed to list the secondary entity.",
          "value": 1
        },
        {
          "name": "Read",
          "summary": "The primary entity is allowed to read the secondary entity.",
          "value": 2
        },
        {
          "name": "Create",
          "summary": "The primary entity is allowed to create the secondary entity.",
          "value": 4
        },
        {
          "name": "Update",
          "summary": "The primary entity is allowed to update the secondary entity.",
          "value": 8
        },
        {
          "name": "Delete",
          "summary": "The primary entity is allowed to delete the secondary entity.",
          "value": 16
        },
        {
          "name": "ShareWithOthers",
          "summary": "The primary entity is allowed to share their other rights to the secondary entity with others.",
          "value": 32
        },
        {
          "name": "Everything",
          "summary": "The primary entity is allowed to do anything with the secondary entity.",
          "value": -1
        }
      ]
    },
    {
      "name": "CollectionRights",
      "summary": "A multivalued enumeration of collection rights that indicate what rights a guest user has on a collection and it's related objects.\n            Do not change the names here.  They are converted to character representations based on the names here.",
      "type": "enum",
      "flags": true,
      "enumValues": [
        {
          "name": "None",
          "summary": "The user is not allowed any kind of access to the uploads.",
          "value": 0
        },
        {
          "name": "List",
          "summary": "The user is allowed to list the uploads.",
          "value": 1
        },
        {
          "name": "Read",
          "summary": "The user is allowed to read the uploads.",
          "value": 2
        },
        {
          "name": "Create",
          "summary": "The user is allowed to create the uploads.",
          "value": 4
        },
        {
          "name": "Update",
          "summary": "The user is allowed to update the uploads.",
          "value": 8
        },
        {
          "name": "Delete",
          "summary": "The user is allowed to delete the uploads.",
          "value": 16
        },
        {
          "name": "ShareWithOthers",
          "summary": "The user is allowed to share their other rights to the uploads with others.",
          "value": 32
        },
        {
          "name": "UploadEverything",
          "summary": "The user is allowed to do anything with the uploads.",
          "value": 255
        },
        {
          "name": "CollectionList",
          "summary": "The user is allowed to list the collection.",
          "value": 256
        },
        {
          "name": "CollectionRead",
          "summary": "The user is allowed to read the collection.",
          "value": 512
        },
        {
          "name": "CollectionCreate",
          "summary": "The user is allowed to create the collection.",
          "value": 1024
        },
        {
          "name": "CollectionUpdate",
          "summary": "The user is allowed to update the collection.",
          "value": 2048
        },
        {
          "name": "CollectionDelete",
          "summary": "The user is allowed to delete the collection.",
          "value": 4096
        },
        {
          "name": "CollectionShareWithOthers",
          "summary": "The user is allowed to share their other rights to the collection with others.",
          "value": 8192
        },
        {
          "name": "CollectionEverything",
          "summary": "The user is allowed to do anything with the collection.",
          "value": 65280
        },
        {
          "name": "SubcollectionList",
          "summary": "The user is allowed to list the subcollections.",
          "value": 65536
        },
        {
          "name": "SubcollectionRead",
          "summary": "The user is allowed to read the subcollections.",
          "value": 131072
        },
        {
          "name": "SubcollectionCreate",
          "summary": "The user is allowed to create the subcollections.",
          "value": 262144
        },
        {
          "name": "SubcollectionUpdate",
          "summary": "The user is allowed to update the subcollections.",
          "value": 524288
        },
        {
          "name": "SubcollectionDelete",
          "summary": "The user is allowed to delete the subcollections.",
          "value": 1048576
        },
        {
          "name": "SubcollectionShareWithOthers",
          "summary": "The user is allowed to share their other rights to the subcollections with others.",
          "value": 2097152
        },
        {
          "name": "SubcollectionEverything",
          "summary": "The user is allowed to do anything with the subcollections.",
          "value": 16711680
        },
        {
          "name": "Everything",
          "summary": "The user is allowed to do anything with the collection, its subfolders, and its uploads.",
          "value": -1
        }
      ]
    },
    {
      "name": "ModifyRightsResponse",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.ModifyRights(AmbientServices.IFileSystem,AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,PicMeModel.CollectionId,AmbientServices.UserId,System.Nullable{AmbientServices.Rights},System.Nullable{AmbientServices.Rights},System.Nullable{AmbientServices.Rights},System.Nullable{AmbientServices.CollectionRights})\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "linksModified",
          "type": "Int32",
          "summary": "The number of links that were modified."
        }
      ]
    },
    {
      "name": "InviteCodeId",
      "summary": "A struct that holds a Compact Invite Code ID.",
      "type": "proxy",
      "representedBy": "String"
    },
    {
      "name": "PatchRightsResponse",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.PatchRights(AmbientServices.IFileSystem,AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,PicMeModel.CollectionId,AmbientServices.Rights,AmbientServices.Rights,AmbientServices.Rights,AmbientServices.Rights,AmbientServices.Rights,AmbientServices.Rights,AmbientServices.CollectionRights,AmbientServices.CollectionRights,System.Nullable{AmbientServices.InviteCodeId})\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "newUserData",
          "type": "CollectionUserData[]",
          "summary": "An array of <see cref=\"T:PicMeApi.CollectionUserData\" /> with the rights for all the users whose rights were modified."
        }
      ]
    },
    {
      "name": "CollectionUserData",
      "summary": "A record containing information about a user who has access to a collection.",
      "type": "composite",
      "members": [
        {
          "name": "userId",
          "type": "UserId",
          "summary": "The ID of the user."
        },
        {
          "name": "name",
          "type": "String",
          "summary": "The name of the user (if known)."
        },
        {
          "name": "collectionRightsOriginCollection",
          "type": "CollectionId",
          "summary": "The <see cref=\"T:PicMeModel.CollectionId\" /> identifying the collection where the user's rights originate, which may be a parent collection."
        },
        {
          "name": "rights",
          "type": "Rights",
          "summary": "The <see cref=\"P:PicMeApi.CollectionUserData.Rights\" /> the user has to the collection itself (metadata, etc.)."
        },
        {
          "name": "participationRights",
          "type": "Rights",
          "summary": "The <see cref=\"P:PicMeApi.CollectionUserData.Rights\" /> the user has to other users uploads within the collection (they always have rights on their own uploads)."
        },
        {
          "name": "subcollectionRights",
          "type": "Rights",
          "summary": "The <see cref=\"P:PicMeApi.CollectionUserData.Rights\" /> the user has to subcollections."
        },
        {
          "name": "combinedRights",
          "type": "CollectionRights",
          "summary": "The packed <see cref=\"T:AmbientServices.CollectionRights\" /> for this user's participation link (or <see cref=\"F:AmbientServices.CollectionRights.Everything\" /> for owners)."
        },
        {
          "name": "getUploaderProfilePicture",
          "type": "Uri?",
          "summary": "A <see cref=\"T:System.Uri\" /> to GET the guest user's profile picture."
        },
        {
          "name": "externalIds",
          "type": "ExternalEntityIdentifier[]?",
          "summary": "An optional array of <see cref=\"T:AmbientServices.ExternalEntityIdentifier\" /> identifying this user account in external systems."
        }
      ]
    },
    {
      "name": "ExternalEntityIdentifier",
      "summary": "A record that contains an external system identifier and an identifier for a specific item in that system.",
      "type": "composite",
      "members": [
        {
          "name": "externalSystemId",
          "type": "String",
          "summary": "A string that uniquely identifies an external system, often a reverse domain name like 'com.facebook' or 'com.venmo'."
        },
        {
          "name": "externalItemId",
          "type": "String",
          "summary": "A string that uniquely identifies an item in that external system."
        }
      ]
    },
    {
      "name": "GetCollectionRightsResponse2",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.GetCollectionRights(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,PicMeApi.AuthData,PicMeModel.CollectionId,System.Nullable{AmbientServices.UserId})\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "rights",
          "type": "Rights",
          "summary": "A <see cref=\"P:PicMeApi.GetCollectionRightsResponse2.Rights\" /> enum indicating all the privileges the user has on the collection itself."
        },
        {
          "name": "participationRights",
          "type": "Rights",
          "summary": "A <see cref=\"P:PicMeApi.GetCollectionRightsResponse2.Rights\" /> enum indicating all the privileges the user has for participation in the collection, ie. on uploads within the collection other than their own."
        },
        {
          "name": "subcollectionRights",
          "type": "Rights",
          "summary": "A <see cref=\"P:PicMeApi.GetCollectionRightsResponse2.Rights\" /> enum indicating all the privileges the user has on subcollections in the collection."
        },
        {
          "name": "combinedRights",
          "type": "CollectionRights",
          "summary": "The packed <see cref=\"T:AmbientServices.CollectionRights\" /> equivalent to the three decoded channels (same encoding as <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> links)."
        }
      ]
    },
    {
      "name": "GetCollectionStatsResponse",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.GetCollectionStats(System.String,AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,PicMeApi.AuthData,PicMeModel.CollectionId,System.Nullable{AmbientServices.UserId})\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "collectionId",
          "type": "CollectionId",
          "summary": "The <see cref=\"P:PicMeApi.GetCollectionStatsResponse.CollectionId\" /> for the collection these stats are about."
        },
        {
          "name": "uploadCount",
          "type": "Int32",
          "summary": "The current total number of uploads in the collection."
        },
        {
          "name": "totalStorageBytesUsed",
          "type": "Int64",
          "summary": "The total number of bytes used."
        },
        {
          "name": "monthDownloadCount",
          "type": "Int32",
          "summary": "The number of times an upload has been downloaded this month (by all users)."
        },
        {
          "name": "monthDownloadBytesUsed",
          "type": "Int64",
          "summary": "The total number of bytes used downloading uploads this month (by all users)."
        },
        {
          "name": "dayDownloadCount",
          "type": "Int32",
          "summary": "The number of times an upload has been downloaded today (by all users)."
        },
        {
          "name": "dayDownloadBytesUsed",
          "type": "Int64",
          "summary": "The total number of bytes used downloading uploads today (by all users)."
        },
        {
          "name": "userMonthDownloadCount",
          "type": "Int32",
          "summary": "The number of times an upload has been downloaded this month (by the specified user)."
        },
        {
          "name": "userMonthDownloadBytesUsed",
          "type": "Int64",
          "summary": "The total number of bytes used downloading uploads this month (by the specified user)."
        },
        {
          "name": "userDayDownloadCount",
          "type": "Int32",
          "summary": "The number of times an upload has been downloaded today (by the specified user)."
        },
        {
          "name": "userDayDownloadBytesUsed",
          "type": "Int64",
          "summary": "The total number of bytes used downloading uploads today (by the specified user)."
        }
      ]
    },
    {
      "name": "ListChildCollectionsResponse",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.ListChildCollections(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,PicMeModel.CollectionId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "collections",
          "type": "ListedCollection[]",
          "summary": "An array of <see cref=\"T:PicMeApi.ListedCollection\" /> objects, one for each collection the user has access to."
        }
      ]
    },
    {
      "name": "ListedCollection",
      "summary": "A record containing the data for a collection returned in a list of collections.\n            Note that only direct rights are reported here.  \n            The caller must compute inherited rights.",
      "type": "composite",
      "members": [
        {
          "name": "collection",
          "type": "Collection",
          "summary": "The <see cref=\"P:PicMeApi.ListedCollection.Collection\" /> contining the collection data."
        },
        {
          "name": "getCoverPhotoUri",
          "type": "Uri",
          "summary": "A <see cref=\"T:System.Uri\" /> to the collection cover photo."
        },
        {
          "name": "userRights",
          "type": "Rights?",
          "summary": "The <see cref=\"T:AmbientServices.Rights\" /> on the collection if the user has rights on this collection either from ownership or <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> links.  Note that if the user has *inherited* rights on this collection, they will not be shown."
        },
        {
          "name": "userParticipationRights",
          "type": "Rights?",
          "summary": "The <see cref=\"T:AmbientServices.Rights\" /> on the collection's uploads if the user has rights on them either from ownership or <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> links."
        },
        {
          "name": "userSubcollectionRights",
          "type": "Rights?",
          "summary": "The <see cref=\"T:AmbientServices.Rights\" /> on the collection's subcollections if the user has rights on them either from ownership or <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> links."
        },
        {
          "name": "userCombinedRights",
          "type": "CollectionRights?",
          "summary": "The packed <see cref=\"T:AmbientServices.CollectionRights\" /> stored on the participation link, or null when the user has no such link for this listing."
        },
        {
          "name": "children",
          "type": "CollectionId[]?",
          "summary": "An array of <see cref=\"T:PicMeModel.CollectionId\" />s for the children (if selected).  Null if not selected."
        }
      ]
    },
    {
      "name": "LinkChildCollectionResponse",
      "summary": "A record containing the response after linking a parent collection to a child.",
      "type": "composite",
      "members": [
        {
          "name": "childCollectionId",
          "type": "CollectionId",
          "summary": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the child collection that was linked."
        },
        {
          "name": "childCollectionGlobalId",
          "type": "RecordGlobalId",
          "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the child collection that was linked."
        }
      ]
    },
    {
      "name": "UnlinkChildCollectionResponse",
      "summary": "A record containing the response after deleting a hierarchy link.",
      "type": "composite",
      "members": [
        {
          "name": "childCollectionId",
          "type": "CollectionId",
          "summary": "The <see cref=\"T:PicMeModel.CollectionId\" /> for the child collection that was unlinked."
        },
        {
          "name": "childCollectionGlobalId",
          "type": "RecordGlobalId",
          "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the child collection that was unlinked."
        }
      ]
    },
    {
      "name": "ListUploaderUsersResponse",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.ListUploaderUsers(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,PicMeApi.AuthData,PicMeModel.CollectionId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "users",
          "type": "UploaderUserData[]",
          "summary": "A list of <see cref=\"T:PicMeApi.UploaderUserData\" /> with information about all the users that have uploaded something to the collection."
        }
      ]
    },
    {
      "name": "UploaderUserData",
      "summary": "A record containing information about a user who has uploaded to a collection.",
      "type": "composite",
      "members": [
        {
          "name": "userId",
          "type": "UserId",
          "summary": "The ID of the user."
        },
        {
          "name": "name",
          "type": "String",
          "summary": "The name of the user (if known)."
        },
        {
          "name": "rights",
          "type": "Rights?",
          "summary": "The <see cref=\"P:PicMeApi.UploaderUserData.Rights\" /> the user has to the collection itself (metadata, etc.), if any."
        },
        {
          "name": "participationRights",
          "type": "Rights?",
          "summary": "The <see cref=\"P:PicMeApi.UploaderUserData.Rights\" /> the user has to other users uploads within the collection (they always have rights on their own uploads), if any"
        },
        {
          "name": "subcollectionRights",
          "type": "Rights?",
          "summary": "The <see cref=\"P:PicMeApi.UploaderUserData.Rights\" /> the user has to subcollection within the collection, if any"
        },
        {
          "name": "combinedRights",
          "type": "CollectionRights?",
          "summary": "The packed <see cref=\"T:AmbientServices.CollectionRights\" /> for this user on the collection, or null if unknown."
        },
        {
          "name": "getUploaderProfilePicture",
          "type": "Uri?",
          "summary": "A <see cref=\"T:System.Uri\" /> to GET the guest user's profile picture."
        }
      ]
    },
    {
      "name": "ListParentCollectionsResponse",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.ListParentCollections(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,PicMeModel.CollectionId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "collections",
          "type": "ListedCollection[]",
          "summary": "An array of <see cref=\"T:PicMeApi.ListedCollection\" /> objects, one for each collection the user has access to."
        }
      ]
    },
    {
      "name": "GetCollectionResponse2",
      "summary": "A record containing the collection metadata for the specified collection.",
      "type": "composite",
      "members": [
        {
          "name": "collection",
          "type": "Collection",
          "summary": "The <see cref=\"P:PicMeApi.GetCollectionResponse2.Collection\" /> data from the _database."
        },
        {
          "name": "getCoverPhotoUri",
          "type": "Uri",
          "summary": "A <see cref=\"T:System.Uri\" /> to the collection cover photo."
        }
      ]
    },
    {
      "name": "Collection",
      "summary": "A record that contains the core (non-link but indexed, or security-related) data for a collection.",
      "type": "composite",
      "members": [
        {
          "name": "collectionId",
          "type": "CollectionId",
          "summary": "The <see cref=\"P:PicMeModel.Collection.CollectionId\" /> for the collection.  Ignored as an input."
        },
        {
          "name": "collectionGlobalId",
          "type": "RecordGlobalId",
          "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the collection.  Ignored as an input."
        },
        {
          "name": "created",
          "type": "DateTime",
          "summary": "The <see cref=\"T:System.DateTime\" /> when the collection was created.  Ignored as an input."
        },
        {
          "name": "creatorUserId",
          "type": "UserId",
          "summary": "The <see cref=\"T:AmbientServices.UserId\" /> of the creator so that collections can be searched by creator.  Ignored as an input."
        },
        {
          "name": "modified",
          "type": "DateTime",
          "summary": "The <see cref=\"T:System.DateTime\" /> when the collection was modified.  Ignored as an input."
        },
        {
          "name": "name",
          "type": "String",
          "summary": "The name of the collection (indexed as a whole)."
        },
        {
          "name": "type",
          "type": "String",
          "summary": "A string indicating what the collection is for (wedding reception, family reunion, etc.)"
        },
        {
          "name": "message",
          "type": "String",
          "summary": "A message to display to uploaders."
        },
        {
          "name": "notes",
          "type": "Text?",
          "summary": "Optional notes about the collection, which may be displayed to viewers of the collection."
        },
        {
          "name": "tagMap",
          "type": "TagMap[]?",
          "summary": "An optional array of <see cref=\"P:PicMeModel.Collection.TagMap\" /> that maps a user-displayable and changeable tag to an internal identifier used in the tags properties for uploads in the collection."
        },
        {
          "name": "featureFlags",
          "type": "CollectionFeatureFlags?",
          "summary": "An optional set of <see cref=\"T:PicMeModel.CollectionFeatureFlags\" /> indicating what kinds of things are currently allowed in this collection."
        },
        {
          "name": "coverPhotoVersionStamp",
          "type": "GenericIdentifier?",
          "summary": "A <see cref=\"T:AmbientServices.GenericIdentifier\" /> that changes every time the cover photo changes (and which gets included in the path of the cover photo URL)."
        },
        {
          "name": "collectionPlan",
          "type": "CollectionPlan",
          "summary": "The <see cref=\"P:PicMeModel.Collection.CollectionPlan\" /> indicating what the user has paid for.    Ignored as an input unless by and administrator or there is a payment made when changed."
        },
        {
          "name": "uploadStart",
          "type": "DateTime?",
          "summary": "The optional <see cref=\"T:System.DateTime\" /> when the uploads to the collection may begin."
        },
        {
          "name": "uploadEnd",
          "type": "DateTime?",
          "summary": "The optional <see cref=\"T:System.DateTime\" /> when the uploads to the collection must stop."
        },
        {
          "name": "slideShowAudio",
          "type": "UploadId?",
          "summary": "An <see cref=\"T:PicMeModel.UploadId\" />indicating an audio file to use for the slideshow.  Not used by the server.  [Deprecated]"
        },
        {
          "name": "slideShowSettings",
          "type": "SlideShowSettings?",
          "summary": "A <see cref=\"P:PicMeModel.Collection.SlideShowSettings\" /> containing attributes controlling the slideshow.  Not used by the server."
        },
        {
          "name": "sortOrder",
          "type": "String?",
          "summary": "A string indicating the default sort order for the collection.  This may indicate something like \"CreateDate\", \"UploadDate\", \"Type\", \"Uploader\", \"Tumbler/Custom\" (uses tumbler in UploadId).  Not currently used by the server."
        },
        {
          "name": "showVenmoLink",
          "type": "Boolean",
          "summary": "Whether to show a venmo link to guests."
        },
        {
          "name": "venmoHandle",
          "type": "String?",
          "summary": "The Venmo handle of the user who will receive Venmo donations."
        },
        {
          "name": "venmoMessage",
          "type": "String?",
          "summary": "The message to show guests to request donations."
        },
        {
          "name": "venmoDefaultDonationDollars",
          "type": "Double?",
          "summary": "The default dollar amount to for Venmo donations."
        }
      ]
    },
    {
      "name": "SlideShowSettings",
      "summary": "Represents the configuration options for a slideshow, including filtering by favorites, specifying audio tracks, and\n            setting the duration for each slide.",
      "description": "Use this record to customize slideshow behavior according to user preferences, such as limiting\n            content to favorites or adding background audio. All parameters are optional except for the favorites\n            filter.",
      "type": "composite",
      "members": [
        {
          "name": "filterByFavorites",
          "type": "Boolean",
          "summary": "true to include only favorite items in the slideshow; otherwise, false to include all items."
        },
        {
          "name": "audio",
          "type": "UploadId[]?",
          "summary": "An optional array of audio identifiers to play during the slideshow. If null, no audio will be played."
        },
        {
          "name": "timePerSlide",
          "type": "TimeSpan?",
          "summary": "An optional time span that specifies how long each slide is displayed. If null, a default duration is used."
        },
        {
          "name": "transitionType",
          "type": "String?",
          "summary": "An optional string that specifies the type of transition effect between slides (e.g., \"fade\", \"slide\"). If null, a default transition is used."
        },
        {
          "name": "transitionTime",
          "type": "TimeSpan?",
          "summary": "An optional time span that specifies the duration of the transition effect between slides. If null, a default transition duration is used."
        }
      ]
    },
    {
      "name": "CollectionPlan",
      "summary": "An enumeration of the possible paid (or unpaid) collection plans, which may or may not supercede user plans depending on rules TBD.",
      "type": "enum",
      "flags": false,
      "enumValues": [
        {
          "name": "None",
          "summary": "The user has not paid for a plan and will be restricted to whatever the free plan allows, or whatever the user-level plan allows.",
          "value": 0
        },
        {
          "name": "Unlimited",
          "summary": "This collection is completely unlimited.",
          "value": 1
        }
      ]
    },
    {
      "name": "GenericIdentifier",
      "summary": "A struct that holds a generic (GUID-type) identifier.",
      "type": "proxy",
      "representedBy": "String"
    },
    {
      "name": "CollectionFeatureFlags",
      "summary": "An enumeration of feature flags for a collection.\n            These are used to indicate what features the collection owner has selected.",
      "type": "enum",
      "flags": true,
      "enumValues": [
        {
          "name": "Default",
          "summary": "The default set of features are enabled.",
          "value": 0
        },
        {
          "name": "BlockNewComments",
          "summary": "The collection blocks new comments on the collection.",
          "value": 2
        },
        {
          "name": "BlockExistingComments",
          "summary": "The collection blocks display of existing comments on the collection.",
          "value": 4
        },
        {
          "name": "BlockNewUploadComments",
          "summary": "The collection blocks new comments on uploads in the collection.",
          "value": 8
        },
        {
          "name": "BlockExistingUploadComments",
          "summary": "The collection blocks display of existing comments on uploads in the collection.",
          "value": 16
        },
        {
          "name": "BlockNewUploadVotes",
          "summary": "The collection blocks new poll voting on uploads in the collection.",
          "value": 32
        },
        {
          "name": "BlockExistingUploadVotes",
          "summary": "The collection blocks display of existing poll votes on uploads in the collection.",
          "value": 64
        },
        {
          "name": "BlockInvitationResharing",
          "summary": "The collection blocks display of invitation resharing UI.",
          "value": 128
        },
        {
          "name": "OwnerPaysForDownloads",
          "summary": "For this collection, guests are not responsible for downloads.  All downloads count against the owner's budget instead of the guest.",
          "value": 256
        }
      ]
    },
    {
      "name": "TagMap",
      "summary": "A record that maps a user-displayable tag to an internal identifier used in the <see cref=\"P:PicMeModel.Collection.TagMap\" /> text.\n            Tag mappings are completely client-defined, but identifiers should include feature scope prefixes so that future features can use different scopes and not have to worry about colliding with existing features.",
      "type": "composite",
      "members": [
        {
          "name": "displayName",
          "type": "String",
          "summary": "The human-readable tag display name."
        },
        {
          "name": "id",
          "type": "String",
          "summary": "The immutable internal identifier for that display name, which will usually be a number, but may be in any UTF-8-representable base the client chooses, as long as the representation doesn't include spaces.  Tag identifiers should be prefixed with an identifier to separate different types of tags such as User:, Favorite:, etc. so that future features can use tags in different scopes without collisions."
        }
      ]
    },
    {
      "name": "PatchCollectionResponse2",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.PatchCollection(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,PicMeApi.AuthData,PicMeModel.CollectionId,AmbientServices.Partial{PicMeModel.Collection})\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "collection",
          "type": "Collection",
          "summary": "The <see cref=\"P:PicMeApi.PatchCollectionResponse2.Collection\" /> data that was written to the _database."
        }
      ]
    },
    {
      "name": "DeleteCollectionResponse2",
      "summary": "A record containing the response after deleting a collection.",
      "type": "composite",
      "members": [
        {
          "name": "collectionId",
          "type": "CollectionId",
          "summary": "The <see cref=\"P:PicMeApi.DeleteCollectionResponse2.CollectionId\" /> for the collection to be deleted."
        },
        {
          "name": "collectionGlobalId",
          "type": "RecordGlobalId",
          "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the collection."
        }
      ]
    },
    {
      "name": "RestoreDeletedCollectionResponse",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.RestoreDeletedCollection(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,PicMeModel.PicMeGlobalCounters,PicMeApi.AuthData,PicMeModel.CollectionId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "ownershipRestored",
          "type": "Boolean",
          "summary": "Whether or not ownership was restored."
        }
      ]
    },
    {
      "name": "ListUsersResponse2",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.ListUsers(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,PicMeApi.AuthData,PicMeModel.CollectionId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "users",
          "type": "CollectionUserData[]",
          "summary": "A list of <see cref=\"T:PicMeApi.CollectionUserData\" /> with information about all the users that have access to the collection and what rights the have on the collection and the uploads within it.\"/&gt;"
        }
      ]
    },
    {
      "name": "TypedStream",
      "summary": "The raw HTTP request body as a <see cref=\"T:System.IO.Stream\" /> together with the <see cref=\"T:AmbientServices.MimeType\" />\n            parsed from the Content-Type header (or <c>application/octet-stream</c> when the header is absent).\n            Use as an API <c>body</c> parameter when the handler needs the client-declared media type alongside the payload.",
      "type": "typedStream"
    },
    {
      "name": "Text",
      "summary": "A struct that holds a string of text that should be indexed as words rather than as a single complete string because it is expected to be longer, possibly multi-line.",
      "type": "proxy",
      "representedBy": "String"
    },
    {
      "name": "BulkCollectionsFromCsvResponse",
      "summary": "Result summary for <see cref=\"M:PicMeApi.CollectionApis.BulkCollectionsFromCsv(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeModel.PicMeGlobalCounters,PicMeApi.AuthData,AmbientServices.TypedStream,System.Boolean,System.Nullable{AmbientServices.Text})\" />.",
      "type": "composite",
      "members": [
        {
          "name": "rowsProcessed",
          "type": "Int32"
        },
        {
          "name": "collectionsCreated",
          "type": "Int32"
        },
        {
          "name": "collectionsUpdated",
          "type": "Int32"
        },
        {
          "name": "invitationsCreated",
          "type": "Int32"
        },
        {
          "name": "invitationsUpdated",
          "type": "Int32"
        },
        {
          "name": "collections",
          "type": "Collection[]"
        },
        {
          "name": "inviteCodes",
          "type": "InviteCode[]"
        }
      ]
    },
    {
      "name": "InviteCode",
      "summary": "A InviteCode record is a child record of either a collection or user parent record and describes the properties of a Invite code.",
      "type": "composite",
      "members": [
        {
          "name": "inviteCodeId",
          "type": "InviteCodeId",
          "summary": "The ID of the Invite code."
        },
        {
          "name": "inviteCodeGlobalId",
          "type": "RecordGlobalId",
          "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the Invite code."
        },
        {
          "name": "created",
          "type": "DateTime",
          "summary": "The UTC time when the link was created."
        },
        {
          "name": "creatorUserId",
          "type": "UserId",
          "summary": "The ID of the user that created the link."
        },
        {
          "name": "modified",
          "type": "DateTime",
          "summary": "The UTC time when the link was most recently modified."
        },
        {
          "name": "name",
          "type": "String",
          "summary": "The name of the Invite Code."
        },
        {
          "name": "clientInformation",
          "type": "String",
          "summary": "A client-controlled string containing any information not otherwise in the Invite code that is needed by the client to render a good Invite Code landing page and post-activation page."
        },
        {
          "name": "temporarilyDisabled",
          "type": "Boolean",
          "summary": "Whether or not the code should be temporarily disabled (allows the user to temporarily disable the code while retaining all the other properties)."
        },
        {
          "name": "start",
          "type": "DateTime?",
          "summary": "An optional <see cref=\"T:System.DateTime\" /> (in UTC) indicating when the Invite code should start working."
        },
        {
          "name": "end",
          "type": "DateTime?",
          "summary": "An optional <see cref=\"T:System.DateTime\" /> (in UTC) indicating when the Invite code should stop working."
        },
        {
          "name": "linkActivator",
          "type": "LinkActivator?",
          "summary": "An optional <see cref=\"P:PicMeModel.InviteCode.LinkActivator\" /> which contains templates for the <see cref=\"T:AmbientServices.Link\" />s that will be created when the Invite code is activated."
        },
        {
          "name": "message",
          "type": "String?",
          "summary": "The invitation message."
        },
        {
          "name": "restrictToOwner",
          "type": "Boolean",
          "summary": "Whether to restrict this invite code to owners only (no sharing allowed)."
        },
        {
          "name": "patchNormalized",
          "type": "InviteCode",
          "summary": "Normalizes the InviteCode by either returning this instance if it is already normalized, or creating a new instance with normalized properties."
        },
        {
          "name": "normalizeWithImplied",
          "type": "InviteCode",
          "summary": "Normalizes the InviteCode with privileges which are implied by other privileges or by the creation time."
        }
      ]
    },
    {
      "name": "LinkActivator",
      "summary": "A record containing information needed to activate one or more <see cref=\"T:AmbientServices.Link\" />s.\n            A <see cref=\"T:PicMeModel.LinkTemplate\" /> has all the information needed to decide if the link should be created and what information it should contain.",
      "type": "composite",
      "members": [
        {
          "name": "linkTemplates",
          "type": "LinkTemplate[]",
          "summary": "An array of <see cref=\"T:PicMeModel.LinkTemplate\" /> objects with missing data to be filled in with ambient data (typically the activating user's account id where primary or secondary is empty). Multiple templates are supported—for example, both <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> and <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> on the same collection."
        },
        {
          "name": "limit",
          "type": "UInt16",
          "summary": "An optional limit on the maximum number of users that will be allowed to activate the Invite code.  Defaults to zero (no limit)."
        },
        {
          "name": "restrictToContacts",
          "type": "String[]?",
          "summary": "An optional list of email addresses or phone numbers to restrict usage to.  When set, only user accounts with the specified contact information (email address or phone number) will be allowed to activate the invitation.  No guest activation will be allowed.  Entries should be in RFC 5322 format, which allows for a prefixed full name with the actual email address (or phone number in this case) in angle brackets.  This field is suppressed in non-owner reads."
        },
        {
          "name": "passwordRequired",
          "type": "String?",
          "summary": "An optional password that must be specified in order to activate the invitation.  When set, may be unspecified or null, or a non-empty string.  Setting to an empty string will cause an error.  When retrieved, null (or unspecified) indicates that no password is required.  Empty string indicates that the server has filtered a hidden password here that the UI needs to collect and give to the server in order to activate the invitiation."
        }
      ]
    },
    {
      "name": "LinkTemplate",
      "summary": "A record containing data about a <see cref=\"T:AmbientServices.Link\" /> to create.",
      "type": "composite",
      "members": [
        {
          "name": "relationshipType",
          "type": "LinkRelationshipType",
          "summary": "A <see cref=\"T:AmbientServices.LinkRelationshipType\" /> that separates this link from other types of links and correlates to a specific set of <see cref=\"T:AmbientServices.LinkRelationship\" />s that are valid for links of this relationshipType.\n            For collection invitations, <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> applies to guest actions on uploads in the collection (including others' uploads when flags include <see cref=\"F:AmbientServices.CollectionRights.Update\" /> / <see cref=\"F:AmbientServices.CollectionRights.Delete\" />),\n            while <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> applies to the collection entity itself (e.g. <see cref=\"F:AmbientServices.CollectionRights.Update\" /> where APIs check direct access rights on the collection record).\n            See the remarks on those <see cref=\"T:AmbientServices.LinkRelationshipType\" /> members for details."
        },
        {
          "name": "primary",
          "type": "RecordGlobalId",
          "summary": "A <see cref=\"T:AmbientServices.RecordGlobalId\" /> identifying the primary entity for the link, or <see cref=\"P:AmbientServices.RecordGlobalId.Empty\" /> to fill in the activating user as the primary in the link."
        },
        {
          "name": "secondary",
          "type": "RecordGlobalId",
          "summary": "A <see cref=\"T:AmbientServices.RecordGlobalId\" /> identifying the secondary entity for the link, or <see cref=\"P:AmbientServices.RecordGlobalId.Empty\" /> to fill in the activating user as the secondary in the link."
        },
        {
          "name": "relationship",
          "type": "LinkRelationship",
          "summary": "A <see cref=\"P:PicMeModel.LinkTemplate.Relationship\" /> indicating the nature of the relationship.  This string may contain multiple parts indicating various rights in one direction, the other direction, or both, but must not contain forward slashes.  The format and type of this property is determined by <see cref=\"P:PicMeModel.LinkTemplate.RelationshipType\" /> and should be documented with the type value used there."
        },
        {
          "name": "conflictResolution",
          "type": "LinkConflictResolution",
          "summary": "A <see cref=\"T:PicMeModel.LinkConflictResolution\" /> indicating what to do if there are already similar links."
        }
      ]
    },
    {
      "name": "LinkConflictResolution",
      "summary": "A multivalued enumeration that indicates how to resolve conflicts when creating a link from a <see cref=\"T:PicMeModel.LinkTemplate\" />.\n            The link's <see cref=\"P:PicMeModel.LinkTemplate.RelationshipType\" /> always has to match to count as a conflict.",
      "type": "enum",
      "flags": true,
      "enumValues": [
        {
          "name": "Default",
          "summary": "Default conflict resolution (allow similar links as long as they differ in any way).",
          "value": 0
        },
        {
          "name": "MergeRelationship",
          "summary": "If a similar link exists, the relationships should be merged using the default merge algorithm which assumes that the relationship is a multivalued enum, so values are merged using a bitwise OR operation.\n            Also implies that the primary and secondary must match to count as a conflict.",
          "value": 1
        },
        {
          "name": "ThrowException",
          "summary": "Throw an exception if a conflicting link already exists.",
          "value": 2
        },
        {
          "name": "PrimaryMatches",
          "summary": "The primary matching another link is required to count as a conflict.",
          "value": 4
        },
        {
          "name": "SecondaryMatches",
          "summary": "The secondary matching another link is required to count as a conflict.",
          "value": 8
        },
        {
          "name": "MergeRelationshipWithConcat",
          "summary": "If a similar link exists, the relationships should be merged assuming that the relationship is an undelimited string enum.",
          "value": 257
        },
        {
          "name": "ConcatWithComma",
          "summary": "Must be used with <see cref=\"F:PicMeModel.LinkConflictResolution.MergeRelationshipWithConcat\" />, indicates that rather than an undelimited string, the string is comma-delimited.",
          "value": 512
        },
        {
          "name": "ConcatWithSemicolon",
          "summary": "Must be used with <see cref=\"F:PicMeModel.LinkConflictResolution.MergeRelationshipWithConcat\" />, indicates that rather than an undelimited string, the string is semicolon-delimited.",
          "value": 1024
        }
      ]
    },
    {
      "name": "ListAllDeletedUploadDetailsResponse",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.ListUploads(System.String,AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,PicMeModel.CollectionId,PicMeModel.UploadCondition,PicMeModel.UploadQuery,System.String,System.Nullable{System.Int32})\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "uploadsPerPage",
          "type": "Int32",
          "summary": "The number of uploads to return per page of responses."
        },
        {
          "name": "collections",
          "type": "CollectionWithCover[]",
          "summary": "An array of<see cref=\"T:PicMeLogic.CollectionWithCover\" /> for the collection containing the uploads."
        },
        {
          "name": "uploads",
          "type": "AllDeletedUploadDetails[]",
          "summary": "An array of <see cref=\"T:PicMeApi.AllDeletedUploadDetails\" /> for the deleted uploads."
        },
        {
          "name": "continuation",
          "type": "String?",
          "summary": "A string that can be passed to a subsequent call in order to continue listing just after this page of results."
        }
      ]
    },
    {
      "name": "AllDeletedUploadDetails",
      "summary": "A record containing information about an upload and the uploader.",
      "type": "composite",
      "members": [
        {
          "name": "collectionId",
          "type": "CollectionId",
          "summary": "The <see cref=\"P:PicMeApi.AllDeletedUploadDetails.CollectionId\" /> of the collection containing the upload."
        },
        {
          "name": "upload",
          "type": "Upload",
          "summary": "The <see cref=\"P:PicMeApi.AllDeletedUploadDetails.Upload\" /> containing the metadata for the upload."
        },
        {
          "name": "thumbnailUrl",
          "type": "Uri",
          "summary": "The <see cref=\"T:System.Uri\" /> for the thumbnail, which will not exist until the upload is successfully uploaded and processed."
        },
        {
          "name": "dateDeleted",
          "type": "DateTime",
          "summary": "The <see cref=\"T:System.DateTime\" /> when the upload was deleted."
        }
      ]
    },
    {
      "name": "CollectionWithCover",
      "summary": "A record containing metadata for a collection, along with the URL to get the cover photo.",
      "type": "composite",
      "members": [
        {
          "name": "collection",
          "type": "Collection",
          "summary": "The <see cref=\"P:PicMeLogic.CollectionWithCover.Collection\" /> metadata."
        },
        {
          "name": "getCoverPhotoUri",
          "type": "Uri",
          "summary": "The <see cref=\"T:System.Uri\" /> to get the cover photo."
        }
      ]
    },
    {
      "name": "GetUserStatsDetailsResponse",
      "summary": "A record containing statistics for every collection owned by the user.",
      "type": "composite",
      "members": [
        {
          "name": "allCollectionStats",
          "type": "CollectionStats[]",
          "summary": "An array of <see cref=\"T:PicMeApi.GetCollectionStatsResponse\" /> containing details for each collection the user owns."
        }
      ]
    },
    {
      "name": "CollectionStats",
      "summary": "A record containing stats about the collections a user owns.",
      "type": "composite",
      "members": [
        {
          "name": "collectionId",
          "type": "CollectionId",
          "summary": "The <see cref=\"P:PicMeLogic.CollectionStats.CollectionId\" /> of the collection to which the stats belong."
        },
        {
          "name": "totalUploads",
          "type": "Int32",
          "summary": "The total number of uploads across all owned collections."
        },
        {
          "name": "totalUploadBytes",
          "type": "Int64",
          "summary": "The total number of bytes used by uploads across all owned collections."
        }
      ]
    },
    {
      "name": "GetCollectionLimitsResponse",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.GetCollectionLimits(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,PicMeApi.AuthData,PicMeModel.CollectionId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "uploadSizeBytes",
          "type": "Int64",
          "summary": "The largest number of bytes allowed for an upload in this collection.  There is always a limit."
        },
        {
          "name": "uploads",
          "type": "Int32",
          "summary": "The maximum number of uploads allowed for this collection.  There is always a limit."
        },
        {
          "name": "storageBytes",
          "type": "Int64?",
          "summary": "The maximum total number of bytes used for storage.  If null, uses the upper limit which is <paramref name=\"Uploads\" /> times <paramref name=\"UploadSizeBytes\" />."
        }
      ]
    },
    {
      "name": "ListAllCollectionUsersResponse",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.ListUsers(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,PicMeApi.AuthData,PicMeModel.CollectionId)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "collections",
          "type": "CollectionWithCover[]",
          "summary": "A list of <see cref=\"T:PicMeLogic.CollectionWithCover\" /> for all the collections that have guests listed."
        },
        {
          "name": "users",
          "type": "UserWithCollectionRights[]",
          "summary": "A list of <see cref=\"T:PicMeApi.CollectionUserData\" /> with information about all the users that have access to the collection and what rights the have on the collection and the uploads within it.\"/&gt;"
        }
      ]
    },
    {
      "name": "UserWithCollectionRights",
      "summary": "A record containing information about a user who has access to a collection.",
      "type": "composite",
      "members": [
        {
          "name": "user",
          "type": "UserWithNameAndProfile",
          "summary": "The <see cref=\"T:PicMeLogic.UserWithNameAndProfile\" /> containing information about the user."
        },
        {
          "name": "collectionRights",
          "type": "UserCollectionRights[]",
          "summary": "The <see cref=\"T:PicMeLogic.UserCollectionRights\" /> indicating which collections this user has rights to and the rights they have."
        }
      ]
    },
    {
      "name": "UserCollectionRights",
      "summary": "A record containing information about the rights a user has for a collection.",
      "type": "composite",
      "members": [
        {
          "name": "collectionId",
          "type": "CollectionId",
          "summary": "The <see cref=\"P:PicMeLogic.UserCollectionRights.CollectionId\" /> of the collection whose rights are listed."
        },
        {
          "name": "rights",
          "type": "Rights",
          "summary": "The <see cref=\"P:PicMeLogic.UserCollectionRights.Rights\" /> the user has to the collection itself (metadata, etc.)."
        },
        {
          "name": "participationRights",
          "type": "Rights",
          "summary": "The <see cref=\"P:PicMeLogic.UserCollectionRights.Rights\" /> the user has to other users uploads within the collection (they always have rights on their own uploads)."
        },
        {
          "name": "subcollectionRights",
          "type": "Rights",
          "summary": "The <see cref=\"P:PicMeLogic.UserCollectionRights.Rights\" /> the user has to subcollections within the collection."
        },
        {
          "name": "combinedRights",
          "type": "CollectionRights",
          "summary": "The <see cref=\"P:PicMeLogic.UserCollectionRights.Rights\" /> the user has to the collection and its uploads and subcollections combined (i.e. the maximum rights they have to anything in the collection)."
        },
        {
          "name": "collectionRightsOriginCollection",
          "type": "CollectionId",
          "summary": "The <see cref=\"P:PicMeLogic.UserCollectionRights.CollectionId\" /> identifying the collection where the user's rights originate, which may be a parent collection."
        }
      ]
    },
    {
      "name": "UserWithNameAndProfile",
      "summary": "A record containing information about a user with their name and profile picture.",
      "type": "composite",
      "members": [
        {
          "name": "userId",
          "type": "UserId",
          "summary": "The ID of the user."
        },
        {
          "name": "userName",
          "type": "String",
          "summary": "The name of the user (if known)."
        },
        {
          "name": "getUploaderProfilePicture",
          "type": "Uri?",
          "summary": "A <see cref=\"T:System.Uri\" /> to GET the guest user's profile picture."
        },
        {
          "name": "externalIds",
          "type": "ExternalEntityIdentifier[]?",
          "summary": "An optional array of <see cref=\"T:AmbientServices.ExternalEntityIdentifier\" />s representing linked external identities for the user."
        }
      ]
    },
    {
      "name": "ListAllDeletedUploadsResponse",
      "summary": "A record containing a response from the <see cref=\"M:PicMeApi.CollectionApis.ListUploads(System.String,AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,PicMeModel.CollectionId,PicMeModel.UploadCondition,PicMeModel.UploadQuery,System.String,System.Nullable{System.Int32})\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "uploadsPerPage",
          "type": "Int32",
          "summary": "The number of uploads to return per page of responses."
        },
        {
          "name": "collections",
          "type": "CollectionWithCover[]",
          "summary": "An array of <see cref=\"T:PicMeLogic.CollectionWithCover\" /> containing information about the collections the uploads belong to."
        },
        {
          "name": "uploads",
          "type": "ListedDeletedUpload[]",
          "summary": "An array of <see cref=\"T:PicMeApi.ListedUpload\" /> for the uploads."
        },
        {
          "name": "continuation",
          "type": "String?",
          "summary": "A string that can be passed to a subsequent call in order to continue listing just after this page of results."
        }
      ]
    },
    {
      "name": "ListedDeletedUpload",
      "summary": "A record containing data about a deleted upload.",
      "type": "composite",
      "members": [
        {
          "name": "collectionId",
          "type": "CollectionId",
          "summary": "The <see cref=\"P:PicMeApi.ListedDeletedUpload.CollectionId\" /> of the collection containing the upload."
        },
        {
          "name": "uploadId",
          "type": "UploadId",
          "summary": "The <see cref=\"P:PicMeApi.ListedDeletedUpload.UploadId\" /> of the upload."
        },
        {
          "name": "uploadGlobalId",
          "type": "RecordGlobalId",
          "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> of the upload."
        },
        {
          "name": "mimeType",
          "type": "MimeType",
          "summary": "The <see cref=\"P:PicMeApi.ListedDeletedUpload.MimeType\" /> indicating the type of file the upload contains."
        },
        {
          "name": "thumbnailUrl",
          "type": "Uri",
          "summary": "The <see cref=\"T:System.Uri\" /> for the thumbnail, which will not exist until the upload is successfully uploaded and processed."
        },
        {
          "name": "dateDeleted",
          "type": "DateTime",
          "summary": "The <see cref=\"T:System.DateTime\" /> when the upload was deleted."
        }
      ]
    },
    {
      "name": "RecordGlobalId",
      "summary": "A structured replacement for <see cref=\"T:AmbientServices.RecordIdentifier\" /> that contains the same data, a type-qualified and parent-qualified global identifier for a database record.\n            Records may be children of other records, and this identifier contains the path to the parent in addition to the path to the child record.\n            An example of a record that is a child of another record is an upload within a collection.",
      "type": "proxy",
      "representedBy": "String"
    },
    {
      "name": "CreateInviteCodeResponse",
      "summary": "A record containing the response to Invite generating functions.",
      "type": "composite",
      "members": [
        {
          "name": "inviteCode",
          "type": "InviteCode",
          "summary": "The <see cref=\"P:PicMeModel.CreateInviteCodeResponse.InviteCode\" /> for the newly-created Invite code."
        }
      ]
    },
    {
      "name": "CreateCollectionResponse2",
      "summary": "A record contianing a response from the <see cref=\"M:PicMeApi.CollectionApis.CreateCollection(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,PicMeModel.PicMeGlobalCounters,PicMeApi.AuthData,AmbientServices.Partial{PicMeModel.Collection})\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "collection",
          "type": "Collection",
          "summary": "The <see cref=\"P:PicMeApi.CreateCollectionResponse2.Collection\" /> data that was written to the _database."
        }
      ]
    },
    {
      "name": "CollectionQuery",
      "summary": "A record that holds information about an upload query.",
      "type": "composite",
      "members": [
        {
          "name": "creationTime",
          "type": "DateTimeRange?",
          "summary": "An optional <see cref=\"T:AmbientServices.DateTimeRange\" /> indicating when the desired collections were created."
        },
        {
          "name": "creatorUserId",
          "type": "UserId?",
          "summary": "An optional <see cref=\"T:AmbientServices.UserId\" /> who is the creator of the desired collections."
        },
        {
          "name": "modificationTime",
          "type": "DateTimeRange?",
          "summary": "An optional <see cref=\"T:AmbientServices.DateTimeRange\" /> indicating when the desired collections was modified."
        },
        {
          "name": "name",
          "type": "String?",
          "summary": "An optional string whose value should match the name of the collections."
        },
        {
          "name": "type",
          "type": "String?",
          "summary": "A string indicating the <see cref=\"P:PicMeModel.Collection.Type\" /> for the desired collections."
        },
        {
          "name": "collectionPlan",
          "type": "CollectionPlan?",
          "summary": "An optional <see cref=\"P:PicMeModel.CollectionQuery.CollectionPlan\" /> for the desired collections."
        },
        {
          "name": "isEmpty",
          "type": "Boolean",
          "summary": "Checks to see if anything at all is specified in the query (an empty query will have no filters in it)."
        }
      ]
    },
    {
      "name": "ListCollectionsResponse2",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.ListCollections(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,PicMeModel.CollectionQuery,System.Int32,System.String,System.Nullable{AmbientServices.UserId},System.Boolean,System.Boolean)\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "collections",
          "type": "ListedCollection[]",
          "summary": "An array of <see cref=\"T:PicMeApi.ListedCollection\" /> objects, one for each collection the user has access to."
        },
        {
          "name": "creatorStorageLimits",
          "type": "CreatorStorageLimit[]",
          "summary": "An array of <see cref=\"T:PicMeApi.CreatorStorageLimit\" /> records indicating which creators and collections are affected be limits."
        },
        {
          "name": "continuation",
          "type": "String?",
          "summary": "An optional string from the response to a previous call that can be used to continue the list with the next page of results."
        }
      ]
    },
    {
      "name": "CreatorStorageLimit",
      "summary": "A record containing information about owners who have exceeded their storage limits and the collections affected.",
      "type": "composite",
      "members": [
        {
          "name": "creatorUserId",
          "type": "UserId",
          "summary": "The <see cref=\"T:AmbientServices.UserId\" /> of the collection creator"
        },
        {
          "name": "freeUser",
          "type": "Boolean",
          "summary": "Whether the collection creator user is a free user (as opposed to a subscriber)."
        },
        {
          "name": "collectionIds",
          "type": "CollectionId[]",
          "summary": "An array of <see cref=\"T:PicMeModel.CollectionId\" /> indicating which collections were created by this owner."
        },
        {
          "name": "overLimitCheckAgain",
          "type": "DateTime?",
          "summary": "If null, this collection has not yet reached its limit.  If not null, the <see cref=\"T:System.DateTime\" /> when this status is likely to change."
        }
      ]
    },
    {
      "name": "GetUserStatsResponse",
      "summary": "A record containing statistics for the user.",
      "type": "composite",
      "members": [
        {
          "name": "uploadCount",
          "type": "Int32",
          "summary": "The current total number of uploads across all collections owned by this user."
        },
        {
          "name": "totalStorageBytesUsed",
          "type": "Int64",
          "summary": "The total number of storage bytes used by all collections owned by this user."
        },
        {
          "name": "monthDownloadCount",
          "type": "Int32",
          "summary": "The number of times an upload has been downloaded this month."
        },
        {
          "name": "monthDownloadBytesUsed",
          "type": "Int64",
          "summary": "The total number of bytes used downloading uploads this month."
        },
        {
          "name": "dayDownloadCount",
          "type": "Int32",
          "summary": "The number of times an upload has been downloaded today."
        },
        {
          "name": "dayDownloadBytesUsed",
          "type": "Int64",
          "summary": "The total number of bytes used downloading uploads today."
        }
      ]
    },
    {
      "name": "ListDownloadRecordsResponse",
      "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CollectionApis.ListDownloadRecords(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,PicMeApi.AuthData,System.Int32,System.Int32,System.Int32,System.Nullable{PicMeModel.CollectionId},System.Nullable{AmbientServices.UserId})\" /> API.",
      "type": "composite",
      "members": [
        {
          "name": "records",
          "type": "UserDownloadRecord[]",
          "summary": "A list of <see cref=\"T:PicMeApi.UserDownloadRecord\" /> with information about users that downloaded things that matched the specified parameters."
        }
      ]
    },
    {
      "name": "UserDownloadRecord",
      "summary": "A record of a download.",
      "type": "composite",
      "members": [
        {
          "name": "time",
          "type": "DateTime",
          "summary": "The <see cref=\"T:System.DateTime\" /> of the download (UTC)."
        },
        {
          "name": "collectionId",
          "type": "CollectionId",
          "summary": "The <see cref=\"P:PicMeApi.UserDownloadRecord.CollectionId\" /> for the collection which was downloaded from."
        },
        {
          "name": "userId",
          "type": "UserId",
          "summary": "The old <see cref=\"P:PicMeApi.UserDownloadRecord.UserId\" /> for the downloader user."
        },
        {
          "name": "responsiblePartyUserId",
          "type": "UserId",
          "summary": "The <see cref=\"P:PicMeApi.UserDownloadRecord.UserId\" /> for the user who is responsible for the download, which may be the same as the actual downloader, or may be a different user who initiated the download on behalf of the actual downloader."
        },
        {
          "name": "actualDownloaderUserId",
          "type": "UserId?",
          "summary": "The <see cref=\"P:PicMeApi.UserDownloadRecord.UserId\" /> for the user which actually downloaded something, or null if the actual downloader was the responsible party."
        },
        {
          "name": "type",
          "type": "TrackedDownloadType",
          "summary": "The type of download."
        },
        {
          "name": "bytes",
          "type": "Int64",
          "summary": "The number of bytes downloaded."
        },
        {
          "name": "uploadId",
          "type": "UploadId?",
          "summary": "The <see cref=\"P:PicMeApi.UserDownloadRecord.UploadId\" /> for the upload that was downloaded (if null, a zip was downloaded)."
        }
      ]
    }
  ]
}