[
  {
    "endpoint": "AdHandler",
    "preferredHttpPath": "/a/ad",
    "alternateHttpPaths": [
      "/a/HttpAd"
    ],
    "summary": "In-house advertising-related APIs.",
    "description": "This endpoint contains all APIs related to in-house advertising.",
    "apis": [
      {
        "name": "PrepareInterstitialAdCredit",
        "httpMethod": "POST",
        "httpPathRegex": "^/prepare-credit",
        "subPathPattern": "/prepare-credit",
        "summary": "Prepares an interstitial ad credit for the specified user, allowing them to view an interstitial ad and given them a token that may be exchanged for a small amount of data transfer after a period of time.",
        "parameters": [
          {
            "name": "viewId",
            "required": true,
            "type": "String",
            "description": "A unique string that must be preserved and submitted with the returned token in order to receive credit."
          }
        ],
        "return": {
          "type": "PrepareInterstitialAdCreditResponse",
          "description": "A <see cref=\"T:PicMeApi.PrepareInterstitialAdCreditResponse\" /> containing the response."
        }
      },
      {
        "name": "RedeemInterstitialAdCredit",
        "httpMethod": "POST",
        "httpPathRegex": "^/redeem-credit",
        "subPathPattern": "/redeem-credit",
        "summary": "Prepares an interstitial ad credit for the specified user, allowing them to view an interstitial ad and given them a token that may be exchanged for a small amount of data transfer after a period of time.",
        "parameters": [
          {
            "name": "viewId",
            "required": true,
            "type": "String",
            "description": "A unique string that must be preserved and submitted with the returned token in order to receive credit."
          },
          {
            "name": "token",
            "required": true,
            "type": "String",
            "description": "The token that was returned by <see cref=\"M:PicMeApi.AdApis.PrepareInterstitialAdCredit(AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,System.String)\" />."
          }
        ],
        "return": {
          "type": "RedeemInterstitialAdCreditResponse",
          "description": "A <see cref=\"T:PicMeApi.RedeemInterstitialAdCreditResponse\" /> containing the response."
        }
      },
      {
        "name": "RecordImpression",
        "httpMethod": "POST",
        "httpPathRegex": "^/impression",
        "subPathPattern": "/impression",
        "summary": "Records an ad impression (an ad that was seen for a certain amount of time in a certain context by an end user).",
        "parameters": [
          {
            "name": "adId",
            "required": true,
            "type": "String",
            "description": "The identifier for the ad, as returned by <see cref=\"M:PicMeApi.AdApis.ListAds(AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,System.String,PicMeApi.AuthData,System.Boolean)\" />."
          },
          {
            "name": "collectionId",
            "required": false,
            "type": "String?",
            "description": "An optional collection ID to associate the ad serving with."
          },
          {
            "name": "contextId",
            "required": false,
            "type": "String?",
            "description": "A string identifying the context of the ad, ie. where on what place it is placed."
          }
        ],
        "return": {
          "type": "RecordImpressionResponse",
          "description": "A <see cref=\"T:PicMeApi.RecordImpressionResponse\" />."
        }
      },
      {
        "name": "ListAds",
        "httpMethod": "GET",
        "httpPathRegex": "^/ads",
        "subPathPattern": "/ads",
        "summary": "Lists possible ads to use for future ad impressions.",
        "parameters": [
          {
            "name": "collectionId",
            "required": false,
            "type": "String?",
            "description": "An optional collection ID to associate the ad serving with."
          },
          {
            "name": "unitTest",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not this is a unit test."
          }
        ],
        "return": {
          "type": "ListAdsResponse",
          "description": "A <see cref=\"T:PicMeApi.ListAdsResponse\" /> containing the ads to display."
        }
      },
      {
        "name": "AdServe",
        "httpMethod": "GET",
        "httpPathRegex": "^/ad",
        "subPathPattern": "/ad",
        "status": "deprecated",
        "notes": "Use preloaded ads and impression recording instead",
        "summary": "Serves up an ad of the specified size.",
        "parameters": [
          {
            "name": "collectionId",
            "required": false,
            "type": "String?",
            "description": "An optional collection ID to associate the ad serving with."
          },
          {
            "name": "adSize",
            "required": false,
            "type": "AdSize?",
            "description": "An <see cref=\"T:PicMeApi.AdSize\" /> indicating what size ad to serve."
          },
          {
            "name": "contextId",
            "required": false,
            "type": "String?",
            "description": "A string identifying the context of the ad, ie. where on what place it is placed."
          },
          {
            "name": "unitTest",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not this is a unit test."
          }
        ],
        "return": {
          "type": "RedirectResponse",
          "description": "Redirects directly to the ad image."
        }
      }
    ],
    "types": [
      {
        "name": "PrepareInterstitialAdCreditResponse",
        "summary": "A record containing the response from <see cref=\"M:PicMeApi.AdApis.PrepareInterstitialAdCredit(AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,System.String)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "token",
            "type": "SignedSecurityToken",
            "summary": "The <see cref=\"T:AmbientServices.SignedSecurityToken\" /> assigned to the user and the specified view ID that will allow redemption of some kind of credit when the appropriate time has elapsed."
          }
        ]
      },
      {
        "name": "SignedSecurityToken",
        "summary": "A struct that holds a PicMe collection sharing authorization code.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "RedeemInterstitialAdCreditResponse",
        "summary": "A record containing the response from <see cref=\"M:PicMeApi.AdApis.RedeemInterstitialAdCredit(AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,PicMeApi.AuthData,System.String,System.String)\" />."
      },
      {
        "name": "RecordImpressionResponse",
        "summary": "A record containing the response from <see cref=\"M:PicMeApi.AdApis.RecordImpression(AmbientServices.IFileSystem,System.String,System.String,PicMeApi.AuthData,System.String)\" />."
      },
      {
        "name": "ListAdsResponse",
        "summary": "A list of ads to be displayed in the future.",
        "type": "composite",
        "members": [
          {
            "name": "ads",
            "type": "ListedAd[]",
            "summary": "An array of <see cref=\"T:PicMeApi.ListedAd\" /> objects, each containing information about one possible ad to display."
          }
        ]
      },
      {
        "name": "ListedAd",
        "summary": "An entry for the ad list.",
        "type": "composite",
        "members": [
          {
            "name": "size",
            "type": "AdSize",
            "summary": "The <see cref=\"T:PicMeApi.AdSize\" /> of this ad."
          },
          {
            "name": "adId",
            "type": "String",
            "summary": "The ID of the ad to display."
          },
          {
            "name": "uri",
            "type": "Uri",
            "summary": "A <see cref=\"P:PicMeApi.ListedAd.Uri\" /> for the image for the ad."
          },
          {
            "name": "expiration",
            "type": "DateTime",
            "summary": "A <see cref=\"T:System.DateTime\" /> indicating the UTC expiration of <paramref name=\"Uri\" />."
          }
        ]
      },
      {
        "name": "AdSize",
        "summary": "An enumeration of sizes for ads.",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "Small",
            "summary": "A small ad, about 283x187 pixels.",
            "value": 0
          },
          {
            "name": "Medium",
            "summary": "A medium ad, about 283x343 pixels.",
            "value": 1
          },
          {
            "name": "Large",
            "summary": "A large ad.  ???x??? pixels.",
            "value": 2
          }
        ]
      },
      {
        "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."
          }
        ]
      }
    ]
  },
  {
    "endpoint": "AdministrativeHandler",
    "preferredHttpPath": "/a/\u8D85",
    "alternateHttpPaths": [
      "/a/HttpAdministrative"
    ],
    "summary": "Administrative APIs.",
    "description": "This endpoint contains all APIs related to administrative functionality.",
    "apis": [
      {
        "name": "GetSystemDashboard",
        "httpMethod": "GET",
        "httpPathRegex": "^/system-dashboard",
        "subPathPattern": "/system-dashboard",
        "summary": "Gets system stats.",
        "parameters": [
          {
            "name": "statisticIds",
            "required": true,
            "type": "String[]",
            "description": "An array of the desired statistic IDs."
          },
          {
            "name": "startRange",
            "required": false,
            "type": "DateOnly?",
            "description": "A <see cref=\"T:System.DateOnly\" /> indicating the start of the desired range.  Defaults to 30 days ago."
          },
          {
            "name": "endRange",
            "required": false,
            "type": "DateOnly?",
            "description": "A <see cref=\"T:System.DateOnly\" /> indicating the end of the desired range.  Defaults to today."
          }
        ],
        "return": {
          "type": "GetSystemStatsResponse",
          "description": "The <see cref=\"T:PicMeApi.GetSystemStatsResponse\" /> containing the response."
        }
      },
      {
        "name": "GetServerStats",
        "httpMethod": "GET",
        "httpPathRegex": "^/server-stats",
        "subPathPattern": "/server-stats",
        "summary": "Gets server stats.",
        "parameters": [
          {
            "name": "statisticIds",
            "required": true,
            "type": "String[]",
            "description": "An array of the desired statistic IDs."
          }
        ],
        "return": {
          "type": "GetServerStatsResponse",
          "description": "The <see cref=\"T:PicMeApi.GetServerStatsResponse\" /> containing the response."
        }
      },
      {
        "name": "ListAvailableSystemStats",
        "httpMethod": "GET",
        "httpPathRegex": "^/system-stats",
        "subPathPattern": "/system-stats",
        "summary": "Gets a list of the available system stats.",
        "parameters": [],
        "return": {
          "type": "ListAvailableSystemStatsResponse",
          "description": "The <see cref=\"T:PicMeApi.ListAvailableSystemStatsResponse\" /> containing the response."
        }
      }
    ],
    "types": [
      {
        "name": "GetSystemStatsResponse",
        "summary": "A record containing the response from <see cref=\"M:PicMeApi.AdministrativeApis.GetSystemDashboard(AmbientServices.Database,AmbientServices.IFileSystem,System.String[],System.Nullable{System.DateOnly},System.Nullable{System.DateOnly})\" />.",
        "type": "composite",
        "members": [
          {
            "name": "rangeInfo",
            "type": "StatsRangeInfo",
            "summary": "The <see cref=\"T:AmbientServices.StatsRangeInfo\" /> containing information about the range of statistics returned."
          },
          {
            "name": "stats",
            "type": "StatInfo[]",
            "summary": "An array of <see cref=\"T:AmbientServices.StatInfo\" /> containing the statistics samples for each requested statistic."
          }
        ]
      },
      {
        "name": "StatInfo",
        "type": "composite",
        "members": [
          {
            "name": "id",
            "type": "String"
          },
          {
            "name": "name",
            "type": "String"
          },
          {
            "name": "description",
            "type": "String"
          },
          {
            "name": "units",
            "type": "String?"
          },
          {
            "name": "fixedFloatingPointAdjustment",
            "type": "Double"
          },
          {
            "name": "preferredTemporalAggregationType",
            "type": "AggregationTypes"
          },
          {
            "name": "samples",
            "type": "Int32[]"
          }
        ]
      },
      {
        "name": "AggregationTypes",
        "type": "enum",
        "flags": true,
        "enumValues": [
          {
            "name": "None",
            "value": 0
          },
          {
            "name": "Sum",
            "value": 1
          },
          {
            "name": "Average",
            "value": 2
          },
          {
            "name": "Min",
            "value": 4
          },
          {
            "name": "Max",
            "value": 8
          },
          {
            "name": "MostRecent",
            "value": 16
          }
        ]
      },
      {
        "name": "StatsRangeInfo",
        "type": "composite",
        "members": [
          {
            "name": "start",
            "type": "DateTime"
          },
          {
            "name": "end",
            "type": "DateTime"
          },
          {
            "name": "durationPerSample",
            "type": "TimeSpan"
          }
        ]
      },
      {
        "name": "GetServerStatsResponse",
        "summary": "A record containing the response from <see cref=\"M:PicMeApi.AdministrativeApis.GetServerStats(AmbientServices.IFileSystem,System.String[])\" />."
      },
      {
        "name": "ListAvailableSystemStatsResponse",
        "summary": "A record containing the response from <see cref=\"M:PicMeApi.AdministrativeApis.ListAvailableSystemStats(AmbientServices.IFileSystem)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "availableStats",
            "type": "Statistic[]",
            "summary": "An array of system statistics available to be queried using <see cref=\"M:PicMeApi.AdministrativeApis.GetSystemDashboard(AmbientServices.Database,AmbientServices.IFileSystem,System.String[],System.Nullable{System.DateOnly},System.Nullable{System.DateOnly})\" />."
          }
        ]
      },
      {
        "name": "Statistic",
        "summary": "Represents a system statistic with a name and a unique identifier.",
        "type": "composite",
        "members": [
          {
            "name": "id",
            "type": "String",
            "summary": "The unique identifier for the system statistic. Cannot be null."
          },
          {
            "name": "name",
            "type": "String",
            "summary": "The display name of the system statistic. Cannot be null."
          }
        ]
      }
    ]
  },
  {
    "endpoint": "AuthenticationHandler",
    "preferredHttpPath": "/a/a",
    "alternateHttpPaths": [
      "/a/HttpAuthentication"
    ],
    "summary": "Authentication and user account related APIs.",
    "description": "PicMe uses an access token and refresh token based authentication similar to many OAuth systems.\n            After logging in, the short-term access token is used to authenticate API calls and the long-term refresh token is used to renew the access token.\n            Callers can check to see if an account with a specified email or phone number already exists so they can guide the user through the account creation process.\n            The user must agree to terms of service at some point before doing other things in the system, but the APIs are flexible in that they allow that to happen at any one of the APIs during the sign up process.\n            Sign up requires verification of the user\u0027s email or phone number using a random code sent to the account.\n            Users can use a temporary guest account before giving us their email or phone number and then merge the accounts later.\n            The system tracks referrals between users.",
    "apis": [
      {
        "name": "ContinuePasswordReset",
        "httpMethod": "POST",
        "httpPathRegex": "^/user/username/(?<emailOrPhoneNumber>[^?/&]+)/continue-password",
        "subPathPattern": "/user/username/{emailOrPhoneNumber}/continue-password",
        "summary": "Continue a password reset operation (step two).",
        "parameters": [
          {
            "name": "emailOrPhoneNumber",
            "required": true,
            "type": "String",
            "description": "The email or phone number of the user account whose password is to be reset."
          },
          {
            "name": "confirmationCode",
            "required": true,
            "type": "String",
            "description": "The confirmation code, presumably from the email or text that was sent in the first step."
          },
          {
            "name": "newPassword",
            "required": true,
            "type": "String",
            "description": "The new password for the account."
          }
        ],
        "return": {
          "type": "ContinuePasswordResetResponse",
          "description": "A <see cref=\"T:PicMeApi.ContinuePasswordResetResponse\" /> containing the response."
        }
      },
      {
        "name": "ContinueSignUpUser",
        "httpMethod": "POST",
        "httpPathRegex": "^/user/username/(?<emailOrPhoneNumber>[^?/&]+)/continue-signup",
        "subPathPattern": "/user/username/{emailOrPhoneNumber}/continue-signup",
        "summary": "Continues the sign-up process for a user (step two).  Fails with an <see cref=\"T:AmbientServices.InvalidStateException\" /> if the account has already been verified.",
        "parameters": [
          {
            "name": "emailOrPhoneNumber",
            "required": true,
            "type": "String",
            "description": "The email or phone number being signed up."
          },
          {
            "name": "verificationCode",
            "required": true,
            "type": "String",
            "description": "The verification code, presumably from the email or text that was sent in the first step."
          },
          {
            "name": "setTosRead",
            "required": true,
            "type": "Boolean",
            "description": "Whether or not to set the Terms of Service being read.  If true, records it as being read right now.  If false, leaves it unmarked."
          },
          {
            "name": "name",
            "required": false,
            "type": "String?",
            "description": "An optional firstname/lastname for the user."
          },
          {
            "name": "password",
            "required": false,
            "type": "String?",
            "description": "An optional new password for the account."
          }
        ],
        "return": {
          "type": "ContinueSignUpUserResponse",
          "description": "A <see cref=\"T:PicMeApi.ContinueSignUpUserResponse\" /> containing the response."
        }
      },
      {
        "name": "CreateClientKeyVersion",
        "httpMethod": "POST",
        "httpPathRegex": "^/client-key/(?<keySetName>[^?/&]+)/(?<keyVersionId>[^?/&]+)",
        "subPathPattern": "/client-key/{keySetName}/{keyVersionId}",
        "summary": "Creates a new client key version.",
        "parameters": [
          {
            "name": "keySetName",
            "required": true,
            "type": "String",
            "description": "A name for the set of keys on both the caller and server side.  Note that his string identifies TWO sets of keys, one with the private keys only on the caller-side and another set with the private keys only on the server-side, each with their own key versions."
          },
          {
            "name": "keyVersionId",
            "required": true,
            "type": "SortKeyString",
            "description": "A <see cref=\"T:AmbientServices.SortKeyString\" /> indicating the version of the key.  Key versions are UTF-8-ordinally sorted strings the identify the sorting of key versions, where the lowest-value string is the most-current key."
          },
          {
            "name": "body",
            "required": true,
            "type": "PublicKeyVersion",
            "description": "A <see cref=\"T:AmbientServices.PublicKeyVersion\" /> containing the public key, the private key of which is retained by the caller."
          }
        ],
        "return": {
          "type": "PublicKeyVersion",
          "description": "A <see cref=\"T:AmbientServices.PublicKeyVersion\" /> that was created."
        }
      },
      {
        "name": "GetClientKeyVersion",
        "httpMethod": "GET",
        "httpPathRegex": "^/client-key/(?<keySetName>[^?/&]+)/(?<keyVersionId>[^?/&]+)",
        "subPathPattern": "/client-key/{keySetName}/{keyVersionId}",
        "summary": "Gets a specific version of previously-registered client key.",
        "parameters": [
          {
            "name": "keySetName",
            "required": true,
            "type": "String",
            "description": "A name for the set of keys on both the caller and server side.  Note that the same name can be used for both client and server keys which are separate lists."
          },
          {
            "name": "keyVersionId",
            "required": true,
            "type": "SortKeyString",
            "description": "A <see cref=\"T:AmbientServices.SortKeyString\" /> indicating which version of the key is to be retrieved."
          }
        ],
        "return": {
          "type": "PublicKeyVersion",
          "description": "A <see cref=\"T:AmbientServices.PublicKeyVersion\" /> containing the requested information."
        }
      },
      {
        "name": "PutClientKeyVersion",
        "httpMethod": "PUT",
        "httpPathRegex": "^/client-key/(?<keySetName>[^?/&]+)/(?<keyVersionId>[^?/&]+)",
        "subPathPattern": "/client-key/{keySetName}/{keyVersionId}",
        "summary": "Puts a new client key version, overwriting any existing key with that version identifier.\n            This API is dangerous as it will overwrite the binary key material for the specified key version, which may break (or could fix, which is why this function exists) any in-flight requests that are using that key version.  \n            Use with extreme caution.",
        "parameters": [
          {
            "name": "keySetName",
            "required": true,
            "type": "String",
            "description": "A name for the set of keys on both the caller and server side.  Note that his string identifies TWO sets of keys, one with the private keys only on the caller-side and another set with the private keys only on the server-side, each with their own key versions."
          },
          {
            "name": "keyVersionId",
            "required": true,
            "type": "SortKeyString",
            "description": "A <see cref=\"T:AmbientServices.SortKeyString\" /> indicating the version of the key.  Key versions are UTF-8-ordinally sorted strings the identify the sorting of key versions, where the lowest-value string is the most-current key."
          },
          {
            "name": "body",
            "required": true,
            "type": "PublicKeyVersion",
            "description": "A <see cref=\"T:AmbientServices.PublicKeyVersion\" /> containing the public key, the private key of which is retained by the caller."
          }
        ],
        "return": {
          "type": "PublicKeyVersion",
          "description": "A <see cref=\"T:AmbientServices.PublicKeyVersion\" /> that was created."
        }
      },
      {
        "name": "PatchClientKeyVersion",
        "httpMethod": "PATCH",
        "httpPathRegex": "^/client-key/(?<keySetName>[^?/&]+)/(?<keyVersionId>[^?/&]+)",
        "subPathPattern": "/client-key/{keySetName}/{keyVersionId}",
        "summary": "Patches a new client key version, changing properties as needed.",
        "parameters": [
          {
            "name": "keySetName",
            "required": true,
            "type": "String",
            "description": "A name for the set of keys on both the caller and server side.  Note that his string identifies TWO sets of keys, one with the private keys only on the caller-side and another set with the private keys only on the server-side, each with their own key versions."
          },
          {
            "name": "keyVersionId",
            "required": true,
            "type": "SortKeyString",
            "description": "A <see cref=\"T:AmbientServices.SortKeyString\" /> indicating the version of the key.  Key versions are UTF-8-ordinally sorted strings the identify the sorting of key versions, where the lowest-value string is the most-current key."
          },
          {
            "name": "body",
            "required": true,
            "type": "JsonPatchDocument\u00601",
            "description": "A <see cref=\"T:AmbientServices.PublicKeyVersion\" /> containing the public key, the private key of which is retained by the caller."
          }
        ],
        "return": {
          "type": "PublicKeyVersion",
          "description": "A <see cref=\"T:AmbientServices.PublicKeyVersion\" /> that was created."
        }
      },
      {
        "name": "DeleteClientKeyVersion",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/client-key/(?<keySetName>[^?/&]+)/(?<keyVersionId>[^?/&]+)",
        "subPathPattern": "/client-key/{keySetName}/{keyVersionId}",
        "summary": "Deletes a new client key version, overwriting any existing key with that version identifier.\n            The specified key version *must* already be disabled.\n            After this call, the specified key version will no longer be available for reactivation.",
        "parameters": [
          {
            "name": "keySetName",
            "required": true,
            "type": "String",
            "description": "A name for the set of keys on both the caller and server side.  Note that his string identifies TWO sets of keys, one with the private keys only on the caller-side and another set with the private keys only on the server-side, each with their own key versions."
          },
          {
            "name": "keyVersionId",
            "required": true,
            "type": "SortKeyString",
            "description": "A <see cref=\"T:AmbientServices.SortKeyString\" /> indicating the version of the key.  Key versions are UTF-8-ordinally sorted strings the identify the sorting of key versions, where the lowest-value string is the most-current key."
          }
        ],
        "return": {
          "type": "EmptyResponse",
          "description": "An <see cref=\"T:AmbientServices.EmptyResponse\" />."
        }
      },
      {
        "name": "CreateServerKeyVersion",
        "httpMethod": "POST",
        "httpPathRegex": "^/server-key/(?<keySetName>[^?/&]+)/(?<keyVersionId>[^?/&]+)",
        "subPathPattern": "/server-key/{keySetName}/{keyVersionId}",
        "summary": "Creates a new server key version.",
        "parameters": [
          {
            "name": "keySetName",
            "required": true,
            "type": "String",
            "description": "A name for the set of keys on both the caller and server side.  Note that his string identifies TWO sets of keys, one with the private keys only on the caller-side and another set with the private keys only on the server-side, each with their own key versions."
          },
          {
            "name": "keyVersionId",
            "required": true,
            "type": "SortKeyString",
            "description": "A <see cref=\"T:AmbientServices.SortKeyString\" /> indicating the version of the key.  Key versions are UTF-8-ordinally sorted strings the identify the sorting of key versions, where the lowest-value string is the most-current key."
          },
          {
            "name": "body",
            "required": true,
            "type": "PublicKeyVersion",
            "description": "A <see cref=\"T:AmbientServices.PublicKeyVersion\" /> containing the public key, of which only the <see cref=\"P:AmbientServices.PublicKeyVersion.VersionStatus\" /> and <see cref=\"P:AmbientServices.PublicKeyVersion.KeyPairType\" /> are not ignored.  Currently the <see cref=\"P:AmbientServices.PublicKeyVersion.KeyPairType\" /> must be <see cref=\"F:AmbientServices.KeyPairType.Rsa\" />.  A <see cref=\"P:AmbientServices.PublicKeyVersion.VersionStatus\" /> other than <see cref=\"T:AmbientServices.KeyVersionStatus\" /> other than <see cref=\"F:AmbientServices.KeyVersionStatus.Current\" /> wouldn't make much sense."
          }
        ],
        "return": {
          "type": "PublicKeyVersion",
          "description": "The <see cref=\"T:AmbientServices.PublicKeyVersion\" /> for the private-public key pair that was created."
        }
      },
      {
        "name": "GetServerKeyVersion",
        "httpMethod": "GET",
        "httpPathRegex": "^/server-key/(?<keySetName>[^?/&]+)/(?<keyVersionId>[^?/&]+)",
        "subPathPattern": "/server-key/{keySetName}/{keyVersionId}",
        "summary": "Gets the public half of the a specific version of a stored server key.",
        "parameters": [
          {
            "name": "keySetName",
            "required": true,
            "type": "String",
            "description": "A name for the set of keys on both the caller and server side.  Note that the same name can be used for both client and server keys which are separate lists."
          },
          {
            "name": "keyVersionId",
            "required": true,
            "type": "SortKeyString",
            "description": "A <see cref=\"T:AmbientServices.SortKeyString\" /> indicating which version of the key is to be retrieved."
          }
        ],
        "return": {
          "type": "PublicKeyVersion",
          "description": "A <see cref=\"T:AmbientServices.PublicKeyVersion\" /> containing the requested information."
        }
      },
      {
        "name": "PutServerKeyVersion",
        "httpMethod": "PUT",
        "httpPathRegex": "^/server-key/(?<keySetName>[^?/&]+)/(?<keyVersionId>[^?/&]+)",
        "subPathPattern": "/server-key/{keySetName}/{keyVersionId}",
        "summary": "Puts a new server key version.  This is implemented for completeness, but I can't think of a legitimate use for this API.  It will overwrite the specified key version with a new private and public key pair, which will definitely break any requests that use that key version.",
        "parameters": [
          {
            "name": "keySetName",
            "required": true,
            "type": "String",
            "description": "A name for the set of keys on both the caller and server side.  Note that his string identifies TWO sets of keys, one with the private keys only on the caller-side and another set with the private keys only on the server-side, each with their own key versions."
          },
          {
            "name": "keyVersionId",
            "required": true,
            "type": "SortKeyString",
            "description": "A <see cref=\"T:AmbientServices.SortKeyString\" /> indicating the version of the key.  Key versions are UTF-8-ordinally sorted strings the identify the sorting of key versions, where the lowest-value string is the most-current key."
          },
          {
            "name": "body",
            "required": true,
            "type": "PublicKeyVersion",
            "description": "A <see cref=\"T:AmbientServices.PublicKeyVersion\" /> containing the public key, of which only the <see cref=\"P:AmbientServices.PublicKeyVersion.VersionStatus\" /> and <see cref=\"P:AmbientServices.PublicKeyVersion.KeyPairType\" /> are not ignored.  Currently the <see cref=\"P:AmbientServices.PublicKeyVersion.KeyPairType\" /> must be <see cref=\"F:AmbientServices.KeyPairType.Rsa\" />.  A <see cref=\"P:AmbientServices.PublicKeyVersion.VersionStatus\" /> other than <see cref=\"T:AmbientServices.KeyVersionStatus\" /> other than <see cref=\"F:AmbientServices.KeyVersionStatus.Current\" /> wouldn't make much sense."
          }
        ],
        "return": {
          "type": "PublicKeyVersion",
          "description": "The <see cref=\"T:AmbientServices.PublicKeyVersion\" /> for the private-public key pair that was created."
        }
      },
      {
        "name": "PatchServerKeyVersion",
        "httpMethod": "PATCH",
        "httpPathRegex": "^/server-key/(?<keySetName>[^?/&]+)/(?<keyVersionId>[^?/&]+)",
        "subPathPattern": "/server-key/{keySetName}/{keyVersionId}",
        "summary": "Patches a new server key version, changing properties as needed.",
        "parameters": [
          {
            "name": "keySetName",
            "required": true,
            "type": "String",
            "description": "A name for the set of keys on both the caller and server side.  Note that his string identifies TWO sets of keys, one with the private keys only on the caller-side and another set with the private keys only on the server-side, each with their own key versions."
          },
          {
            "name": "keyVersionId",
            "required": true,
            "type": "SortKeyString",
            "description": "A <see cref=\"T:AmbientServices.SortKeyString\" /> indicating the version of the key.  Key versions are UTF-8-ordinally sorted strings the identify the sorting of key versions, where the lowest-value string is the most-current key."
          },
          {
            "name": "body",
            "required": true,
            "type": "JsonPatchDocument\u00601",
            "description": "A <see cref=\"T:AmbientServices.PublicKeyVersion\" /> containing the public key, of which only the <see cref=\"P:AmbientServices.PublicKeyVersion.VersionStatus\" /> and <see cref=\"P:AmbientServices.PublicKeyVersion.KeyPairType\" /> are not ignored.  Currently the <see cref=\"P:AmbientServices.PublicKeyVersion.KeyPairType\" /> must be <see cref=\"F:AmbientServices.KeyPairType.Rsa\" />.  A <see cref=\"P:AmbientServices.PublicKeyVersion.VersionStatus\" /> other than <see cref=\"T:AmbientServices.KeyVersionStatus\" /> other than <see cref=\"F:AmbientServices.KeyVersionStatus.Current\" /> wouldn't make much sense."
          }
        ],
        "return": {
          "type": "PublicKeyVersion",
          "description": "The <see cref=\"T:AmbientServices.PublicKeyVersion\" /> for the private-public key pair that was created."
        }
      },
      {
        "name": "DeleteServerKeyVersion",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/server-key/(?<keySetName>[^?/&]+)/(?<keyVersionId>[^?/&]+)",
        "subPathPattern": "/server-key/{keySetName}/{keyVersionId}",
        "summary": "Deletes the specified server key version.\n            The specified key version *must* already be disabled.\n            After this call, the specified key version will no longer be available for reactivation.",
        "parameters": [
          {
            "name": "keySetName",
            "required": true,
            "type": "String",
            "description": "A name for the set of keys on both the caller and server side.  Note that his string identifies TWO sets of keys, one with the private keys only on the caller-side and another set with the private keys only on the server-side, each with their own key versions."
          },
          {
            "name": "keyVersionId",
            "required": true,
            "type": "SortKeyString",
            "description": "A <see cref=\"T:AmbientServices.SortKeyString\" /> indicating the version of the key.  Key versions are UTF-8-ordinally sorted strings the identify the sorting of key versions, where the lowest-value string is the most-current key."
          }
        ],
        "return": {
          "type": "EmptyResponse",
          "description": "An <see cref=\"T:AmbientServices.EmptyResponse\" />."
        }
      },
      {
        "name": "ResendAccountVerification",
        "httpMethod": "POST",
        "httpPathRegex": "^/user/username/(?<emailOrPhoneNumber>[^?/&]+)/verification",
        "subPathPattern": "/user/username/{emailOrPhoneNumber}/verification",
        "summary": "Requests that an account verification message be resent to the specified email or phone number.",
        "parameters": [
          {
            "name": "emailOrPhoneNumber",
            "required": true,
            "type": "String",
            "description": "The email address or phone number for the account that needs verification resent."
          }
        ],
        "return": {
          "type": "ResendAccountVerificationResponse",
          "description": "A <see cref=\"T:PicMeApi.ResendAccountVerificationResponse\" /> containing the response."
        }
      },
      {
        "name": "RequestPasswordReset",
        "httpMethod": "POST",
        "httpPathRegex": "^/user/username/(?<emailOrPhoneNumber>[^?/&]+)/password",
        "subPathPattern": "/user/username/{emailOrPhoneNumber}/password",
        "summary": "Requests a password reset for a specified user.",
        "parameters": [
          {
            "name": "emailOrPhoneNumber",
            "required": true,
            "type": "String",
            "description": "The email address or phone number for the user requesting a password reset."
          }
        ],
        "return": {
          "type": "RequestPasswordResetResponse",
          "description": "A <see cref=\"T:PicMeApi.RequestPasswordResetResponse\" /> containing the response."
        }
      },
      {
        "name": "SignUpUser",
        "httpMethod": "POST",
        "httpPathRegex": "^/user/username/(?<emailOrPhoneNumber>[^?/&]+)/signup",
        "subPathPattern": "/user/username/{emailOrPhoneNumber}/signup",
        "summary": "Signs up a new user.  If the user is already authenticated, this will attempt to upgrade the guest account to a full account.",
        "parameters": [
          {
            "name": "emailOrPhoneNumber",
            "required": true,
            "type": "String",
            "description": "The user's email address or phone number."
          },
          {
            "name": "password",
            "required": false,
            "type": "String?",
            "description": "An optional password to set."
          },
          {
            "name": "setTosRead",
            "required": false,
            "type": "Boolean?",
            "description": "Whether or not to mark the terms of service as having been read/agreed to."
          },
          {
            "name": "referrerUserId",
            "required": false,
            "type": "UserId?",
            "description": "An optional <see cref=\"T:AmbientServices.UserId\" /> indicating the user who referred this user.  This is now deprecated.  Instead, activate a referral invite code just after account creation."
          },
          {
            "name": "userName",
            "required": false,
            "type": "String?",
            "description": "An optional user name."
          }
        ],
        "return": {
          "type": "SignUpUserResponse",
          "description": "A <see cref=\"T:PicMeApi.SignUpUserResponse\" /> containing the response."
        }
      },
      {
        "name": "StartAuthentication",
        "httpMethod": "POST",
        "httpPathRegex": "^/session/username/(?<emailOrPhoneNumber>[^?/&]+)",
        "subPathPattern": "/session/username/{emailOrPhoneNumber}",
        "summary": "Starts authenticating a user.",
        "parameters": [
          {
            "name": "emailOrPhoneNumber",
            "required": true,
            "type": "String",
            "description": "The email address or phone number of the user to authenticate."
          },
          {
            "name": "password",
            "required": true,
            "type": "String",
            "description": "The password to use for the account."
          }
        ],
        "return": {
          "type": "StartAuthenticationResponse",
          "description": "A <see cref=\"T:PicMeApi.StartAuthenticationResponse\" /> containing the response"
        }
      },
      {
        "name": "CheckUsername",
        "httpMethod": "GET",
        "httpPathRegex": "^/user/username/(?<emailOrPhoneNumber>[^?/&]+)",
        "subPathPattern": "/user/username/{emailOrPhoneNumber}",
        "summary": "Checks a username to see if there is already a user using it.",
        "parameters": [
          {
            "name": "emailOrPhoneNumber",
            "required": true,
            "type": "String",
            "description": "The email or phone number to check."
          }
        ],
        "return": {
          "type": "CheckUsernameResponse",
          "description": "A <see cref=\"T:PicMeApi.CheckUsernameResponse\" /> containing information about whether or not such a user exists."
        }
      },
      {
        "name": "GetUserInfo",
        "httpMethod": "POST",
        "httpPathRegex": "^/user/(?<emailOrPhoneNumber>[^?/&]+)",
        "subPathPattern": "/user/{emailOrPhoneNumber}",
        "summary": "Gets the user information for the specified user.",
        "parameters": [
          {
            "name": "emailOrPhoneNumber",
            "required": false,
            "type": "String?",
            "description": "The email or phone number of the user whose information is desired, if searching by email or phone number."
          },
          {
            "name": "userId",
            "required": false,
            "type": "UserId?",
            "description": "The <see cref=\"T:AmbientServices.UserId\" /> to use to get user information, if searching by user ID."
          }
        ],
        "return": {
          "type": "GetUserInfoResponse",
          "description": "A <see cref=\"T:PicMeApi.GetUserInfoResponse\" /> containing the response."
        }
      },
      {
        "name": "GetUserProfileUploadUrl",
        "httpMethod": "POST",
        "httpPathRegex": "^/session/user/profile-picture/urls",
        "subPathPattern": "/session/user/profile-picture/urls",
        "summary": "Deletes all old user profile photos and gets the information needed to upload a new user profile picture.\n            Note that this function does not actually upload the picture.  \n            It just returns the URL to use to upload the picture, and removes any old profile pictures.\n            If this is called and the new profile picture is not subsequently updated, the user will be left without a profile picture.",
        "parameters": [
          {
            "name": "contentType",
            "required": true,
            "type": "String",
            "description": "The MIME-type of the picture to be uploaded."
          }
        ],
        "return": {
          "type": "GetUserProfileUploadUrlResponse",
          "description": "A <see cref=\"T:PicMeApi.GetUserProfileUploadUrlResponse\" /> containing the requested data."
        }
      },
      {
        "name": "ListClientKeyVersions",
        "httpMethod": "GET",
        "httpPathRegex": "^/client-key/(?<keySetName>[^?/&]+)",
        "subPathPattern": "/client-key/{keySetName}",
        "summary": "Lists versions of previously-registered client keys.",
        "parameters": [
          {
            "name": "keySetName",
            "required": true,
            "type": "String",
            "description": "A name for the set of keys on both the caller and server side.  Note that the same name can be used for both client and server keys which are separate lists."
          }
        ],
        "return": {
          "type": "ListClientKeyVersionsResponse",
          "description": "A <see cref=\"T:PicMeApi.ListClientKeyVersionsResponse\" /> containing the requested information."
        }
      },
      {
        "name": "ListServerKeyVersions",
        "httpMethod": "GET",
        "httpPathRegex": "^/server-key/(?<keySetName>[^?/&]+)",
        "subPathPattern": "/server-key/{keySetName}",
        "summary": "Lists the public half of the versions of stored server keys.",
        "parameters": [
          {
            "name": "keySetName",
            "required": true,
            "type": "String",
            "description": "A name for the set of keys on both the caller and server side.  Note that the same name can be used for both client and server keys which are separate lists."
          }
        ],
        "return": {
          "type": "ListServerKeyVersionsResponse",
          "description": "A <see cref=\"T:PicMeApi.ListServerKeyVersionsResponse\" /> containing the requested information."
        }
      },
      {
        "name": "DeleteUserProfilePicture",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/session/user/profile-picture",
        "subPathPattern": "/session/user/profile-picture",
        "summary": "Deletes the profile picture for the authenticated user.",
        "parameters": [],
        "return": {
          "type": "DeleteUserProfilePictureResponse",
          "description": "A <see cref=\"T:PicMeApi.DeleteUserProfilePictureResponse\" /> containing the response."
        }
      },
      {
        "name": "GetUserProfileInfo",
        "httpMethod": "GET",
        "httpPathRegex": "^/user/id/(?<userId>[^?/&]+)",
        "subPathPattern": "/user/id/{userId}",
        "summary": "Gets user profile information for another user, presuming that that user is linked to the authenticated user.",
        "parameters": [
          {
            "name": "userId",
            "required": true,
            "type": "UserId",
            "description": "The <see cref=\"T:AmbientServices.UserId\" /> for the user whose profile information is desired."
          },
          {
            "name": "collectionId",
            "required": false,
            "type": "CollectionId?",
            "description": "A <see cref=\"T:PicMeModel.CollectionId\" /> for the collection that the specified user may own, be a guest user of, or have uploaded something to."
          }
        ],
        "return": {
          "type": "GetUserProfileInfoResponse",
          "description": "A <see cref=\"T:PicMeApi.GetUserProfileInfoResponse\" /> containing the requested information."
        }
      },
      {
        "name": "GetUserStateDataUrls",
        "httpMethod": "POST",
        "httpPathRegex": "^/session/user/state/urls",
        "subPathPattern": "/session/user/state/urls",
        "summary": "Gets the URLs needed to access and update client-defined user state data.",
        "parameters": [],
        "return": {
          "type": "GetUserStateDataUrlsResponse",
          "description": "A <see cref=\"T:PicMeApi.GetUserStateDataUrlsResponse\" /> containing the requested URLs."
        }
      },
      {
        "name": "SetUserAttributes",
        "httpMethod": "POST",
        "httpPathRegex": "^/session/user/attributes",
        "subPathPattern": "/session/user/attributes",
        "summary": "Sets user attributes.",
        "parameters": [
          {
            "name": "name",
            "required": false,
            "type": "String?",
            "description": "The optional first/last name for the user.  If null, no change will be made."
          },
          {
            "name": "setTosRead",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to mark the Terms of Service as having been read."
          },
          {
            "name": "externalIds",
            "required": false,
            "type": "ExternalEntityIdentifier[]?",
            "description": "An optional array of <see cref=\"T:AmbientServices.ExternalEntityIdentifier\" /> objects representing external identities to link to the user.  If null, no change will be made."
          }
        ],
        "return": {
          "type": "SetUserAttributesResponse",
          "description": "A <see cref=\"T:PicMeApi.SetUserAttributesResponse\" /> containing the response."
        }
      },
      {
        "name": "ChangeUserPassword",
        "httpMethod": "PUT",
        "httpPathRegex": "^/session/user/password",
        "subPathPattern": "/session/user/password",
        "summary": "Changes the password for the authenticated user.",
        "parameters": [
          {
            "name": "oldPassword",
            "required": true,
            "type": "String",
            "description": "The old password (must be specified in order to change this way)."
          },
          {
            "name": "newPassword",
            "required": true,
            "type": "String",
            "description": "The new password to set."
          }
        ],
        "return": {
          "type": "ChangeUserPasswordResponse",
          "description": "A <see cref=\"T:PicMeApi.ChangeUserPasswordResponse\" /> containing the requested information."
        }
      },
      {
        "name": "GetMyUserInfo",
        "httpMethod": "GET",
        "httpPathRegex": "^/session/user/info",
        "subPathPattern": "/session/user/info",
        "summary": "Gets the user information for the authenticated user.",
        "parameters": [],
        "return": {
          "type": "GetMyUserInfoResponse",
          "description": "A <see cref=\"T:PicMeApi.GetMyUserInfoResponse\" /> containing the response."
        }
      },
      {
        "name": "RefreshUserAuthentication",
        "httpMethod": "POST",
        "httpPathRegex": "^/session-refresh",
        "subPathPattern": "/session-refresh",
        "summary": "Refreshes user authentication using a refresh token.",
        "parameters": [
          {
            "name": "refreshToken",
            "required": true,
            "type": "SignedSecurityToken",
            "description": "The refresh token from a successful authentication."
          }
        ],
        "return": {
          "type": "RefreshUserAuthenticationResponse",
          "description": "A <see cref=\"T:PicMeApi.RefreshUserAuthenticationResponse\" /> containing the response."
        }
      },
      {
        "name": "SendTestEmail",
        "httpMethod": "POST",
        "httpPathRegex": "^/send-test-email",
        "subPathPattern": "/send-test-email",
        "summary": "Sends a test email to the caller's email account.\n            This function can only be called by system administrators.",
        "parameters": [
          {
            "name": "emailBody",
            "required": false,
            "type": "String?",
            "description": "The body for the email, possibly HTML."
          },
          {
            "name": "rawBody",
            "required": false,
            "type": "String?",
            "description": "The raw body for the email, which may contain both plaintext and HTML, as well as attachments."
          }
        ],
        "return": {
          "type": "SendTestEmailResponse",
          "description": "A <see cref=\"T:PicMeApi.SendTestEmailResponse\" /> containing the response"
        }
      },
      {
        "name": "CreateReferralInviteCode",
        "httpMethod": "POST",
        "httpPathRegex": "^/referralInvite",
        "subPathPattern": "/referralInvite",
        "summary": "Creates a Invite code object for the calling user to refer new users to PicMe.\n            The Invite code will be owned by the calling user and will be hierarchically linked to the specified user.\n            The link type for the activated link is <see cref=\"P:AmbientServices.AuthLinkRelationshipTypes.ReferralLinkType\" /> with a link relationship of type <see cref=\"T:AmbientServices.ReferralType\" />.",
        "parameters": [
          {
            "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."
          }
        ],
        "return": {
          "type": "CreateInviteCodeResponse",
          "description": "A <see cref=\"T:PicMeModel.CreateInviteCodeResponse\" /> containing the metadata for the new Invite code."
        }
      },
      {
        "name": "BlockMessages",
        "httpMethod": "POST",
        "httpPathRegex": "^/block-messages",
        "subPathPattern": "/block-messages",
        "summary": "Adds the specified email or phone number to the blocking list, presumably because the user reported our messages as spam, which could only happen if some other bozo put in their email address or phone number multiple times thinking it was their own.\n            This function can only be called by system administrators.",
        "parameters": [
          {
            "name": "emailOrPhoneNumber",
            "required": true,
            "type": "String",
            "description": "The email address or phone number to block."
          },
          {
            "name": "reason",
            "required": true,
            "type": "String",
            "description": "The system the spam report came from, or a reason for the blocking."
          }
        ],
        "return": {
          "type": "BlockMessagesResponse",
          "description": "A <see cref=\"T:PicMeApi.BlockMessagesResponse\" /> containing the response"
        }
      },
      {
        "name": "DeleteUser",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/session/user",
        "subPathPattern": "/session/user",
        "summary": "Deletes the authenticated user account and everything it owns.",
        "parameters": [
          {
            "name": "targetUserId",
            "required": false,
            "type": "UserId?",
            "description": "The <see cref=\"T:AmbientServices.UserId\" /> of the target user (only for root administrators)."
          }
        ],
        "return": {
          "type": "DeleteUserResponse",
          "description": "A <see cref=\"T:PicMeApi.DeleteUserResponse\" /> containing the response."
        }
      },
      {
        "name": "ContinueWithMfa",
        "httpMethod": "POST",
        "httpPathRegex": "^/session/mfa",
        "subPathPattern": "/session/mfa",
        "summary": "Continues with authentication with another step by specifying an MFA code.",
        "parameters": [
          {
            "name": "body",
            "required": true,
            "type": "ContinueWithMfaBody",
            "description": "The <see cref=\"T:PicMeApi.ContinueWithMfaBody\" /> from the body of the request."
          }
        ],
        "return": {
          "type": "ContinueWithMfaResponse",
          "description": "A <see cref=\"T:PicMeApi.ContinueWithMfaResponse\" /> containing the response"
        }
      },
      {
        "name": "MergeIntoAccount",
        "httpMethod": "PATCH",
        "httpPathRegex": "^/mergeInto",
        "subPathPattern": "/mergeInto",
        "summary": "Merges the currently-authenticated guest account into the specified full account, returning new tokens for the full account.\n            The guest account's data will be removed, so the tokens used to make this call will not be valid after a successful call to this API.",
        "parameters": [
          {
            "name": "targetAccountEmailOrPhoneNumber",
            "required": true,
            "type": "String",
            "description": "The user's email address or phone number."
          },
          {
            "name": "targetAccountPassword",
            "required": true,
            "type": "String",
            "description": "The password for the specified account."
          }
        ],
        "return": {
          "type": "MergeIntoAccountResponse",
          "description": "A <see cref=\"T:PicMeApi.MergeIntoAccountResponse\" /> containing the response."
        }
      },
      {
        "name": "ListMyReferrals",
        "httpMethod": "GET",
        "httpPathRegex": "^/referrals",
        "subPathPattern": "/referrals",
        "summary": "Lists users referred by the currently-authenticated user.",
        "parameters": [],
        "return": {
          "type": "ListReferralsResponse",
          "description": "A <see cref=\"T:PicMeApi.ListReferralsResponse\" /> containing the response."
        }
      },
      {
        "name": "GetMfa",
        "httpMethod": "GET",
        "httpPathRegex": "^/user-mfa",
        "subPathPattern": "/user-mfa",
        "summary": "Gets the MFA configuration for the specified user account or currently-authenticated user (masking the secret key, of course).\n            If the user has not configured MFA, this will throw a NotFoundException.",
        "parameters": [
          {
            "name": "targetUserId",
            "required": true,
            "type": "UserId",
            "description": "The target user ID (must be the currently-authenticated user unless the caller is a root administrator)."
          }
        ],
        "return": {
          "type": "GetMfaResponse",
          "description": "A <see cref=\"T:PicMeApi.GetMfaResponse\" /> with the response."
        }
      },
      {
        "name": "PutMfa",
        "httpMethod": "PUT",
        "httpPathRegex": "^/user-mfa",
        "subPathPattern": "/user-mfa",
        "summary": "Configures MFA for the specified user account using a secret key generated by the client or by calling <see cref=\"M:PicMeApi.AuthenticationApis.CreateTotpSecret(AmbientServices.Auth,AmbientServices.Database,AmbientServices.TotpEncryptionType)\" />.\n            If <paramref name=\"body\" />'s <see cref=\"P:AmbientServices.UserMfa.Delivery\" /> is not <see cref=\"F:AmbientServices.MfaDelivery.None\" />, this API will need to be called twice.  \n            The first call will trigger side-channel delivery of the MFA code, and the second call will verify the code received by the user, just as if they were logging in.\n            Throws a <see cref=\"T:AmbientServices.ParameterOutOfRangeException\" /> if the specified otp code length is not between 6 and 9 digits.\n            Throws a <see cref=\"T:AmbientServices.ParameterException\" /> if the OTP code (or the previous OTP code) doesn't match.",
        "parameters": [
          {
            "name": "targetUserId",
            "required": true,
            "type": "UserId",
            "description": "The target user ID (must be the currently-authenticated user unless the caller is a root administrator)."
          },
          {
            "name": "otp",
            "required": true,
            "type": "String",
            "description": "The current OTP code that was either generated by the authenticator app using the specified encryption and secret, or that was received through the specified side channel.  Note that the number of digits specified in this parameter can be 6-9 digits, but however many are specified is how many will be required for OTP verification going forward.  Ignored (use empty string) for the first call in setting up email or SMS MFA."
          },
          {
            "name": "body",
            "required": true,
            "type": "UserMfa",
            "description": "The body of the POST, containing a <see cref=\"T:AmbientServices.UserMfa\" />, with the allowable data filled in (Delivery, Encryption, Secret)."
          },
          {
            "name": "previousOtp",
            "required": false,
            "type": "String?",
            "description": "An optional previous OTP in case we want to be extra sure that the user has their authenticator app setup correctly with the correct encryption and secret."
          }
        ],
        "return": {
          "type": "UserMfa",
          "description": "A <see cref=\"T:AmbientServices.UserMfa\" /> with the response."
        }
      },
      {
        "name": "DeleteMfa",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/user-mfa",
        "subPathPattern": "/user-mfa",
        "summary": "Deletes the MFA configuration for the specified user account.\n            Note that for administration, after authenticating the user, calling <see cref=\"M:PicMeApi.AuthenticationApis.PutMfa(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.UserId,System.String,AmbientServices.UserMfa,System.String)\" /> with <see cref=\"F:AmbientServices.MfaDelivery.Email\" /> is usually preferable to turning off MFA completely.",
        "parameters": [
          {
            "name": "targetUserId",
            "required": true,
            "type": "UserId",
            "description": "The target user ID (must be the currently-authenticated user unless the caller is a root administrator)."
          },
          {
            "name": "delivery",
            "required": true,
            "type": "MfaDelivery",
            "description": "The <see cref=\"T:AmbientServices.MfaDelivery\" /> indicating how the MFA code should be delivered."
          },
          {
            "name": "encryptionType",
            "required": false,
            "type": "TotpEncryptionType",
            "description": "The optional <see cref=\"T:AmbientServices.TotpEncryptionType\" /> of the secret (if using <see cref=\"F:AmbientServices.MfaDelivery.None\" />)."
          },
          {
            "name": "secret",
            "required": false,
            "type": "String",
            "description": "The BASE-32 secret key (whose length must match what is appropriate for <paramref name=\"encryptionType\" /> (if using <see cref=\"F:AmbientServices.MfaDelivery.None\" />)."
          },
          {
            "name": "requiredDigits",
            "required": false,
            "type": "Int32",
            "description": "The number of digits to require."
          }
        ],
        "return": {
          "type": "DeleteMfaResponse",
          "description": "A <see cref=\"T:AmbientServices.UserMfa\" /> with the response."
        }
      },
      {
        "name": "CheckUserAuthentication",
        "httpMethod": "POST",
        "httpPathRegex": "^/session",
        "subPathPattern": "/session",
        "summary": "Checks to see if a user is authenticated and if they are, gets information about the user.",
        "parameters": [],
        "return": {
          "type": "CheckUserAuthenticationResponse",
          "description": "A <see cref=\"T:PicMeApi.CheckUserAuthenticationResponse\" /> containing the requested data."
        }
      },
      {
        "name": "ListAllUsers",
        "httpMethod": "GET",
        "httpPathRegex": "^/user/id",
        "subPathPattern": "/user/id",
        "status": "deprecated",
        "notes": "Use ListUsers now to get full user information and filtering",
        "summary": "Lists all existing users.\n            Required root administrator privileges.",
        "parameters": [
          {
            "name": "continuation",
            "required": false,
            "type": "String?",
            "description": "A continuation string to continue a previously-interrupted listing."
          }
        ],
        "return": {
          "type": "ListAllUsersResponse",
          "description": "A <see cref=\"T:PicMeApi.ListAllUsersResponse\" /> containing the requested information."
        }
      },
      {
        "name": "InvalidateUserTokens",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/session",
        "subPathPattern": "/session",
        "summary": "Invalidates any tokens for the authenticated user.",
        "parameters": [],
        "return": {
          "type": "InvalidateUserTokensResponse",
          "description": "A <see cref=\"T:PicMeApi.InvalidateUserTokensResponse\" /> containing the response."
        }
      },
      {
        "name": "GetRightsOn",
        "httpMethod": "GET",
        "httpPathRegex": "^/rights",
        "subPathPattern": "/rights",
        "summary": "Checks for ownership and rights on the specified record.",
        "parameters": [
          {
            "name": "recordGlobalId",
            "required": true,
            "type": "RecordGlobalId",
            "description": "The record identifier to check for rights."
          },
          {
            "name": "cancel",
            "required": false,
            "type": "CancellationToken",
            "description": "The <see cref=\"T:System.Threading.CancellationToken\" />."
          }
        ],
        "return": {
          "type": "GetRightsOnResponse",
          "description": "A <see cref=\"T:PicMeApi.GetRightsOnResponse\" /> containing the response data."
        }
      },
      {
        "name": "MergeAccounts",
        "httpMethod": "PATCH",
        "httpPathRegex": "^/merge",
        "subPathPattern": "/merge",
        "summary": "Merges a specified source account into a specified target account.\n            The source account's data will be removed, so the source tokens passed to this call will not be valid after a successful call to this API.",
        "parameters": [
          {
            "name": "sourceAnonymousAccountAccessToken",
            "required": true,
            "type": "String",
            "description": "The access token for the source account, the account that will disappear after the merge.  Must not be a proxy token."
          },
          {
            "name": "targetAccountAccessToken",
            "required": true,
            "type": "String",
            "description": "The access token for the target account, the account that will remain and will contain the items from the source account after the merge.  Must not be a proxy token."
          }
        ],
        "return": {
          "type": "MergeAccountsResponse",
          "description": "A <see cref=\"T:PicMeApi.MergeIntoAccountResponse\" /> containing the response."
        }
      },
      {
        "name": "AuthenticateAsGuest",
        "httpMethod": "POST",
        "httpPathRegex": "^/guest",
        "subPathPattern": "/guest",
        "summary": "Authenticates as a guest (creates a new guest account).",
        "parameters": [
          {
            "name": "setTosRead",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to mark the terms of service as having been read/agreed to."
          },
          {
            "name": "userName",
            "required": false,
            "type": "String?",
            "description": "The user's firstname/lastname (optional)."
          },
          {
            "name": "cancel",
            "required": false,
            "type": "CancellationToken",
            "description": "The <see cref=\"T:System.Threading.CancellationToken\" />"
          }
        ],
        "return": {
          "type": "AuthenticateAsGuestResponse",
          "description": "A <see cref=\"T:PicMeApi.AuthenticateAsGuestResponse\" /> containing the response data."
        }
      },
      {
        "name": "ListUsers",
        "httpMethod": "GET",
        "httpPathRegex": "^/user",
        "subPathPattern": "/user",
        "summary": "Lists all existing users that match the specified filter.\n            Required root administrator privileges.",
        "parameters": [
          {
            "name": "filter",
            "required": false,
            "type": "UserAccountCondition?",
            "description": "An optional <see cref=\"T:AmbientServices.UserAccountCondition\" /> indicating attributes that must be matched for the user accounts to be in the returned list."
          },
          {
            "name": "continuation",
            "required": false,
            "type": "String?",
            "description": "A continuation string to continue a previously-interrupted listing.  Defaults to null."
          },
          {
            "name": "count",
            "required": false,
            "type": "Int32",
            "description": "The number of records to retrieve.  Defaults to 100."
          }
        ],
        "return": {
          "type": "ListUsersResponse",
          "description": "A <see cref=\"T:PicMeApi.ListUsersResponse\" /> containing the requested information."
        }
      },
      {
        "name": "CreateTotpSecret",
        "httpMethod": "POST",
        "httpPathRegex": "^/totp",
        "subPathPattern": "/totp",
        "summary": "Creates a TOTP secret to later be used for enabling TOTP multi-factor authentication.\n            If the client can generate a secret, those are also acceptable.",
        "parameters": [
          {
            "name": "encryptionType",
            "required": true,
            "type": "TotpEncryptionType",
            "description": "The <see cref=\"T:AmbientServices.TotpEncryptionType\" /> to use for the returned secret."
          }
        ],
        "return": {
          "type": "CreateTotpSecretResponse",
          "description": "A <see cref=\"T:PicMeApi.CreateTotpSecretResponse\" /> with the response."
        }
      }
    ],
    "types": [
      {
        "name": "ContinuePasswordResetResponse",
        "summary": "A record containing the response to a request to authenticate as a guest (empty)."
      },
      {
        "name": "ContinueSignUpUserResponse",
        "summary": "A record containing the response to a request to continue a password reset (empty)."
      },
      {
        "name": "SortKeyString",
        "summary": "A record that contains a sortkey string, a string that manages sequencing of string in UTF-8 order, providing methods to get the next and previous sortkey strings.\n            Strings are treated as huge numbers in a base-N numbering system, where N is the number of valid UTF-8 characters.\n            Unless an input with multi-byte UTF-8 characters is used, the sortkey strings will only contain 7-bit ASCII characters because it turns out that provides optimal packing.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "PublicKeyVersion",
        "summary": "A record that holds a specific version of a public key.",
        "type": "composite",
        "members": [
          {
            "name": "versionId",
            "type": "SortKeyString",
            "summary": "A string that uniquely identifies the version of the public key."
          },
          {
            "name": "versionStatus",
            "type": "KeyVersionStatus",
            "summary": "A <see cref=\"T:AmbientServices.KeyVersionStatus\" /> indicating how this key should be used."
          },
          {
            "name": "registeredTime",
            "type": "DateTime",
            "summary": "The date and time when this version of the public key was registered."
          },
          {
            "name": "keyPairType",
            "type": "KeyPairType",
            "summary": "The <see cref=\"T:AmbientServices.KeyPairType\" /> of the key pair."
          },
          {
            "name": "publicKey",
            "type": "Byte[]",
            "summary": "The raw bytes of the public key."
          }
        ]
      },
      {
        "name": "KeyPairType",
        "summary": "An enumeration of supported encryption and/or signing algorithms.",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "Rsa",
            "summary": "RSA encryption/signing.",
            "value": 0
          },
          {
            "name": "Ecdsa",
            "summary": "ECDSA (signing only).",
            "value": 1
          }
        ]
      },
      {
        "name": "KeyVersionStatus",
        "summary": "An enumeration that indicates the status of a private key version.",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "Current",
            "summary": "The version of the key is the most recent current version and may be used for new encrypting or signing operations.",
            "value": 0
          },
          {
            "name": "Enabled",
            "summary": "The version of the key is enabled for verification and decryption, but should not be used for new encryption or signing operations.",
            "value": 1
          },
          {
            "name": "Disabled",
            "summary": "The version of the key has been disabled but has been retained in case it needs to be re-enabled.\n            Once it is no longer needed, it should be removed (in which case we don't need an explicit \"Deleted\" status because it won't exist to be classified).",
            "value": 2
          }
        ]
      },
      {
        "name": "JsonPatchDocument\u00601",
        "type": "composite",
        "members": [
          {
            "name": "operations",
            "type": "List\u00601?"
          },
          {
            "name": "contractResolver",
            "type": "IContractResolver?"
          }
        ]
      },
      {
        "name": "IContractResolver"
      },
      {
        "name": "List\u00601",
        "type": "composite",
        "members": [
          {
            "name": "capacity",
            "type": "Int32"
          },
          {
            "name": "count",
            "type": "Int32"
          },
          {
            "name": "item",
            "type": "Operation\u00601?"
          }
        ]
      },
      {
        "name": "Operation\u00601",
        "type": "composite",
        "members": [
          {
            "name": "value",
            "type": "Object?"
          },
          {
            "name": "operationType",
            "type": "OperationType"
          },
          {
            "name": "path",
            "type": "String?"
          },
          {
            "name": "op",
            "type": "String?"
          },
          {
            "name": "from",
            "type": "String?"
          }
        ]
      },
      {
        "name": "OperationType",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "Add",
            "value": 0
          },
          {
            "name": "Remove",
            "value": 1
          },
          {
            "name": "Replace",
            "value": 2
          },
          {
            "name": "Move",
            "value": 3
          },
          {
            "name": "Copy",
            "value": 4
          },
          {
            "name": "Test",
            "value": 5
          },
          {
            "name": "Invalid",
            "value": 6
          }
        ]
      },
      {
        "name": "Object"
      },
      {
        "name": "EmptyResponse",
        "summary": "An empty record to be used as a response when no content is relevant such as when an item is deleted."
      },
      {
        "name": "ResendAccountVerificationResponse",
        "summary": "A record containing the response to a request to resend an account verification code (empty)."
      },
      {
        "name": "RequestPasswordResetResponse",
        "summary": "A record containing the response to a request to request a password reset (empty)."
      },
      {
        "name": "UserId",
        "summary": "A struct that holds a user identifier.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "SignUpUserResponse",
        "summary": "A record containing the response to a request to sign up a user.",
        "type": "composite",
        "members": [
          {
            "name": "userId",
            "type": "UserId",
            "summary": "The <see cref=\"P:PicMeApi.SignUpUserResponse.UserId\" /> for the newly-created user."
          },
          {
            "name": "assignedPassword",
            "type": "String?",
            "summary": "A password, if one was automatically assigned by the system instead of being passed in."
          }
        ]
      },
      {
        "name": "StartAuthenticationResponse",
        "summary": "A record containing the response to a request to start authentication.",
        "type": "composite",
        "members": [
          {
            "name": "successfulAuthentication",
            "type": "AuthenticationComplete?",
            "summary": "A <see cref=\"T:AmbientServices.AuthenticationComplete\" /> object with information related to a successful authentication."
          },
          {
            "name": "moreAuthenticationRequired",
            "type": "MoreAuthenticationRequired?",
            "summary": "A <see cref=\"T:AmbientServices.MoreAuthenticationRequired\" /> object with information indicating that more steps are needed to complete authentication."
          }
        ]
      },
      {
        "name": "MoreAuthenticationRequired",
        "summary": "A record whose presence indicates that the user will need to do something else to continue with authentication.\n            Each type contains a ContinueWith*** typed token that should be round-tripped through to a ContinueWith*** API along with the additional information that is specific to the type of extra information needed (new password, MFA code, etc.).",
        "type": "composite",
        "members": [
          {
            "name": "newPasswordRequired",
            "type": "CollectNewPassword?",
            "summary": "A <see cref=\"T:AmbientServices.CollectNewPassword\" /> containing information needed to set a new password."
          },
          {
            "name": "continueWithMfa",
            "type": "ContinueWithMfa?",
            "summary": "A <see cref=\"T:AmbientServices.ContinueWithMfa\" /> containing information needed to finish authenticating with multi-factor authentication."
          },
          {
            "name": "continueWithSigningChallenge",
            "type": "ContinueWithSigningChallenge?",
            "summary": "A <see cref=\"T:AmbientServices.ContinueWithSigningChallenge\" /> containing information needed to finish authenticating using certificate signing."
          }
        ]
      },
      {
        "name": "ContinueWithSigningChallenge",
        "summary": "A record containing data needed to complete login with multi-factor authentication, using either email or an authenticator app.",
        "type": "composite",
        "members": [
          {
            "name": "nonce",
            "type": "String",
            "summary": "A random one-time use string that the caller must sign with the certificate and return in an authentication continuation API call."
          }
        ]
      },
      {
        "name": "ContinueWithMfa",
        "summary": "A record containing data needed to complete login with multi-factor authentication, using either email or an authenticator app.",
        "type": "composite",
        "members": [
          {
            "name": "token",
            "type": "SignedSecurityToken",
            "summary": "A <see cref=\"T:AmbientServices.SignedSecurityToken\" /> that contains the signed MFA security token."
          }
        ]
      },
      {
        "name": "CollectNewPassword",
        "summary": "A record containing data needed to set a new password.",
        "type": "composite",
        "members": [
          {
            "name": "token",
            "type": "NewPasswordChallengeToken",
            "summary": "A <see cref=\"T:AmbientServices.NewPasswordChallengeToken\" /> that can be used to set a new password."
          }
        ]
      },
      {
        "name": "NewPasswordChallengeToken",
        "summary": "A struct that holds a password challenge token.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "AuthenticationComplete",
        "summary": "A record containing the response to a request to authenticate or refresh authentication.",
        "type": "composite",
        "members": [
          {
            "name": "authenticated",
            "type": "UserAuthenticated",
            "summary": "A <see cref=\"T:AmbientServices.UserAuthenticated\" /> object containing authentication information."
          },
          {
            "name": "authenticatedUser",
            "type": "UserData",
            "summary": "<see cref=\"T:AmbientServices.UserData\" /> for the authenticated user."
          }
        ]
      },
      {
        "name": "UserData",
        "summary": "A record containing a selective copy of information about a user.",
        "type": "composite",
        "members": [
          {
            "name": "userId",
            "type": "UserId",
            "summary": "The user's <see cref=\"P:AmbientServices.UserData.UserId\" />, which uniquely identifies this user account."
          },
          {
            "name": "userGlobalId",
            "type": "RecordGlobalId",
            "summary": "A <see cref=\"T:AmbientServices.RecordGlobalId\" /> that can be used to generically identify the user record."
          },
          {
            "name": "email",
            "type": "String",
            "summary": "A possibly-empty email address for the user."
          },
          {
            "name": "name",
            "type": "String",
            "summary": "A possibly-empty name (firstname/lastname) for the user."
          },
          {
            "name": "phoneNumber",
            "type": "String",
            "summary": "A possibly-empty phone number for the user."
          },
          {
            "name": "emailVerified",
            "type": "Boolean",
            "summary": "Whether or not the email address has been verified."
          },
          {
            "name": "phoneNumberVerified",
            "type": "Boolean",
            "summary": "Whether or not the phone number has been verified."
          },
          {
            "name": "termsOfServiceRead",
            "type": "Boolean",
            "summary": "Whether or not the terms of service have been read and agreed to."
          },
          {
            "name": "isRegistered",
            "type": "Boolean",
            "summary": "Whether or not the user is \"registered\"."
          },
          {
            "name": "externalIds",
            "type": "ExternalEntityIdentifier[]?",
            "summary": "An optional array of <see cref=\"T:AmbientServices.ExternalEntityIdentifier\" /> identifying this user account in external systems."
          }
        ]
      },
      {
        "name": "UserAuthenticated",
        "summary": "A record containing authentication information.",
        "type": "composite",
        "members": [
          {
            "name": "accessToken",
            "type": "SignedSecurityToken",
            "summary": "The temporary access token."
          },
          {
            "name": "tokenType",
            "type": "String",
            "summary": "The token type.  Currently always \"Bearer\"."
          },
          {
            "name": "refreshToken",
            "type": "SignedSecurityToken",
            "summary": "The more long-term refresh token.  For guest accounts, there is no account password, so this is a permanent token stored in the app, or in the browser data."
          },
          {
            "name": "expiresInSeconds",
            "type": "Int32",
            "summary": "The number of seconds that <paramref name=\"AccessToken\" /> will last before needing to be refreshed."
          },
          {
            "name": "serverTime",
            "type": "DateTime",
            "summary": "The server time in case there is a discrepancy with the client."
          }
        ]
      },
      {
        "name": "CheckUsernameResponse",
        "summary": "A record containing the response to a request to check a username.",
        "type": "composite",
        "members": [
          {
            "name": "code",
            "type": "String",
            "summary": "A code to mirror the structure of an error, but whose value differs from what would be returned in an error so the client can just check the code to see if the request succeeded.  When successful, always contains \"UserExists\"."
          },
          {
            "name": "status",
            "type": "String",
            "summary": "The user's Cognito status.  Currently always contains \"CONFIRMED\".  This will be removed when the React client is no longer in use."
          },
          {
            "name": "verified",
            "type": "Boolean",
            "summary": "Whether or not the account's email or phone number has been verified."
          }
        ]
      },
      {
        "name": "GetUserInfoResponse",
        "summary": "A record containing the response to a request to get a user's profile information.",
        "type": "composite",
        "members": [
          {
            "name": "userData",
            "type": "UserData",
            "summary": "The <see cref=\"P:PicMeApi.GetUserInfoResponse.UserData\" /> for the authenticated user."
          },
          {
            "name": "profilePicture",
            "type": "String",
            "summary": "A string containing a URL that may temporarily be used to GET the user's profile picture."
          },
          {
            "name": "authenticationMethods",
            "type": "String[]",
            "summary": "An array of single-sign-on systems attached to the account."
          },
          {
            "name": "specialUserType",
            "type": "String?",
            "summary": "An optional string identifying a special user type."
          }
        ]
      },
      {
        "name": "GetUserProfileUploadUrlResponse",
        "summary": "A record containing the data needed to update a user's profile picture.",
        "type": "composite",
        "members": [
          {
            "name": "profilePictureLocation",
            "type": "String",
            "summary": "A string containing a URL that may temporariliy be used to PUT a user's profile picture."
          }
        ]
      },
      {
        "name": "ListClientKeyVersionsResponse",
        "summary": "A record containing the response to a request to list client key versions, which is used for end-to-end encryption between the client and server.",
        "type": "composite",
        "members": [
          {
            "name": "keySetName",
            "type": "String",
            "summary": "The name of the key set."
          },
          {
            "name": "keyVersions",
            "type": "PublicKeyVersion[]",
            "summary": "An array of <see cref=\"T:AmbientServices.PublicKeyVersion\" /> records previously registered by the client."
          }
        ]
      },
      {
        "name": "ListServerKeyVersionsResponse",
        "summary": "A record containing the response to a request to list server key versions, which is used for end-to-end encryption between the client and server.",
        "type": "composite",
        "members": [
          {
            "name": "keySetName",
            "type": "String",
            "summary": "The name of the key set."
          },
          {
            "name": "keyVersions",
            "type": "PublicKeyVersion[]",
            "summary": "An array of <see cref=\"T:AmbientServices.PublicKeyVersion\" /> records held by the server (the private part of the key will be masked)."
          }
        ]
      },
      {
        "name": "DeleteUserProfilePictureResponse",
        "summary": "A record containing the response to a request to delete a user's profile picture (empty)."
      },
      {
        "name": "CollectionId",
        "summary": "A struct that holds a PicMe collection id.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "GetUserProfileInfoResponse",
        "summary": "A record containing the response to a request to get a user's profile information from another user's account, such as for listing collection guests or users referred by a user.",
        "type": "composite",
        "members": [
          {
            "name": "name",
            "type": "String",
            "summary": "The user's first/last name, if available."
          },
          {
            "name": "profilePicture",
            "type": "String",
            "summary": "A string containing a URL that may temporarily be used to GET the user's profile picture, or an empty string if there is no user profile picture."
          }
        ]
      },
      {
        "name": "GetUserStateDataUrlsResponse",
        "summary": "A record containing the response to a request to get URLs for getting and putting user state data.",
        "type": "composite",
        "members": [
          {
            "name": "getUserStateData",
            "type": "Uri",
            "summary": "A <see cref=\"T:System.Uri\" /> that can be used temporarily to GET the user state data, whose schema and contents are completely client-controlled."
          },
          {
            "name": "putUserStateData",
            "type": "Uri",
            "summary": "A <see cref=\"T:System.Uri\" /> that can be used temporarily to PUT the user state data, whose schema and contents are completely client-controlled."
          }
        ]
      },
      {
        "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": "SetUserAttributesResponse",
        "summary": "A record containing the response to a request to set user attributes.",
        "type": "composite",
        "members": [
          {
            "name": "reverificationRequired",
            "type": "Boolean",
            "summary": "Whether or not account reverification is required."
          }
        ]
      },
      {
        "name": "ChangeUserPasswordResponse",
        "summary": "A record containing the response to a request to change a user's password.",
        "type": "composite",
        "members": [
          {
            "name": "success",
            "type": "Boolean",
            "summary": "Whether or not the change password request was successful."
          }
        ]
      },
      {
        "name": "GetMyUserInfoResponse",
        "summary": "A record containing the response to a request to get a user's profile information.",
        "type": "composite",
        "members": [
          {
            "name": "userData",
            "type": "UserData",
            "summary": "The <see cref=\"P:PicMeApi.GetMyUserInfoResponse.UserData\" /> for the authenticated user."
          },
          {
            "name": "profilePicture",
            "type": "String",
            "summary": "A string containing a URL that may temporarily be used to GET the user's profile picture."
          },
          {
            "name": "authenticationMethods",
            "type": "String[]",
            "summary": "An array of single-sign-on systems attached to the account."
          }
        ]
      },
      {
        "name": "SignedSecurityToken",
        "summary": "A struct that holds a PicMe collection sharing authorization code.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "RefreshUserAuthenticationResponse",
        "summary": "A record containing the response to a request to refresh authentication using a refresh token.",
        "type": "composite",
        "members": [
          {
            "name": "successfulAuthentication",
            "type": "AuthenticationComplete?",
            "summary": "A <see cref=\"T:AmbientServices.AuthenticationComplete\" /> object containing successful authentication information."
          },
          {
            "name": "moreAuthenticationRequired",
            "type": "MoreAuthenticationRequired?",
            "summary": "A <see cref=\"P:PicMeApi.RefreshUserAuthenticationResponse.MoreAuthenticationRequired\" /> object containing information about more information that is needed to complete the authentication refresh."
          }
        ]
      },
      {
        "name": "SendTestEmailResponse",
        "summary": "A record containing the response to a request to send a test email."
      },
      {
        "name": "AuthLinkRelationshipTypes",
        "summary": "A non-numeric enumeration of link relationship types related to the authentication/authorization system.",
        "type": "proxy",
        "representedBy": "LinkRelationshipType",
        "enumValues": [
          {
            "name": "ReferralLinkType",
            "summary": "A <see cref=\"T:AmbientServices.LinkRelationshipType\" /> for a link that indicates that one user referred another to the platform.\n            The <see cref=\"T:AmbientServices.LinkRelationship\" /> for this type is constructed using <see cref=\"M:AmbientServices.LinkRelationship.FromEnum``1(``0)\" /> with the enum type <see cref=\"T:AmbientServices.ReferralType\" />.",
            "value": "i,R"
          }
        ]
      },
      {
        "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": "ReferralType",
        "summary": "An enumeration of type of referrals.",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "Normal",
            "summary": "The referral is a normal referral (no other types yet).",
            "value": 0
          }
        ]
      },
      {
        "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": "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": "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": "InviteCodeId",
        "summary": "A struct that holds a Compact Invite Code ID.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "BlockMessagesResponse",
        "summary": "A record containing the response to a request to add a user to the block list."
      },
      {
        "name": "DeleteUserResponse",
        "summary": "A record containing the response to a request to delete a user.",
        "type": "composite",
        "members": [
          {
            "name": "userId",
            "type": "UserId",
            "summary": "The <see cref=\"P:PicMeApi.DeleteUserResponse.UserId\" /> of the user that was deleted."
          }
        ]
      },
      {
        "name": "ContinueWithMfaBody",
        "summary": "The body for the <see cref=\"M:PicMeApi.AuthenticationApis.ContinueWithMfa(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,PicMeApi.ContinueWithMfaBody,System.Net.IPAddress,System.String)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "continuation",
            "type": "ContinueWithMfa",
            "summary": "The <see cref=\"T:AmbientServices.ContinueWithMfa\" /> that came from the <see cref=\"T:AmbientServices.MoreAuthenticationRequired\" /> returned by a previous authentication step."
          },
          {
            "name": "otp",
            "type": "String",
            "summary": "The OTP code needed to continue authenticating."
          }
        ]
      },
      {
        "name": "ContinueWithMfaResponse",
        "summary": "A record containing the response from <see cref=\"M:PicMeApi.AuthenticationApis.ContinueWithMfa(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,PicMeApi.ContinueWithMfaBody,System.Net.IPAddress,System.String)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "successfulAuthentication",
            "type": "AuthenticationComplete?",
            "summary": "A <see cref=\"T:AmbientServices.AuthenticationComplete\" /> object with information related to a successful authentication."
          },
          {
            "name": "moreAuthenticationRequired",
            "type": "MoreAuthenticationRequired?",
            "summary": "A <see cref=\"P:PicMeApi.ContinueWithMfaResponse.MoreAuthenticationRequired\" /> object with information indicating that more steps are needed to complete authentication."
          }
        ]
      },
      {
        "name": "MergeIntoAccountResponse",
        "summary": "A record containing the response to the <see cref=\"M:PicMeApi.AuthenticationApis.MergeIntoAccount(AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.Auth,PicMeModel.PicMeGlobalCounters,System.String,System.String,PicMeApi.AuthData,System.Net.IPAddress)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "successfulAuthentication",
            "type": "AuthenticationComplete?",
            "summary": "A <see cref=\"P:PicMeApi.MergeIntoAccountResponse.SuccessfulAuthentication\" /> indicating that the authentication was successful."
          },
          {
            "name": "moreAuthenticationRequired",
            "type": "MoreAuthenticationRequired?",
            "summary": "A <see cref=\"P:PicMeApi.MergeIntoAccountResponse.MoreAuthenticationRequired\" /> indicating that another step is required to finish authenticating."
          }
        ]
      },
      {
        "name": "ListReferralsResponse",
        "summary": "A record containing the response to a request to list referrals.",
        "type": "composite",
        "members": [
          {
            "name": "referrals",
            "type": "Referral[]",
            "summary": "An array of <see cref=\"T:PicMeApi.Referral\" /> objects, each containing information about one referred user."
          }
        ]
      },
      {
        "name": "Referral",
        "summary": "A record containing information about a referral.",
        "type": "composite",
        "members": [
          {
            "name": "userId",
            "type": "UserId",
            "summary": "The <see cref=\"P:PicMeApi.Referral.UserId\" /> of the referred or referring user."
          },
          {
            "name": "emailOrPhoneNumber",
            "type": "String",
            "summary": "The email or phone number of the referred or referring user."
          },
          {
            "name": "name",
            "type": "String",
            "summary": "The first/last name of the user, if available."
          }
        ]
      },
      {
        "name": "GetMfaResponse",
        "summary": "A record containing the response to a request to get MFA configuration.",
        "type": "composite",
        "members": [
          {
            "name": "mfa",
            "type": "UserMfa?",
            "summary": "The <see cref=\"T:AmbientServices.UserMfa\" /> for the specified user, with secret fields masked, or null if the user has not configured MFA."
          }
        ]
      },
      {
        "name": "UserMfa",
        "summary": "A user account MFA record that may be created for a user account, enabling extra account security through TOTP verification.",
        "type": "composite",
        "members": [
          {
            "name": "delivery",
            "type": "MfaDelivery",
            "summary": "A <see cref=\"T:AmbientServices.MfaDelivery\" /> indicating how MFA should be delivered when attempting authentication."
          },
          {
            "name": "encryption",
            "type": "TotpEncryptionType",
            "summary": "A <see cref=\"T:AmbientServices.TotpEncryptionType\" /> identifying the encryption used for generating the MFA token."
          },
          {
            "name": "createdDate",
            "type": "DateTime",
            "summary": "The <see cref=\"T:System.DateTime\" /> when the MFA record was first created.  Ignored as an input."
          },
          {
            "name": "modifiedDate",
            "type": "DateTime",
            "summary": "The <see cref=\"T:System.DateTime\" /> when the MFA record was most recently modified.  Ignored as an input."
          },
          {
            "name": "requiredDigits",
            "type": "Int32",
            "summary": "The number of digits to require for MFA, in the range 6-9."
          },
          {
            "name": "secret",
            "type": "String",
            "summary": "The write-only BASE32 secret key.  Empty string when <paramref name=\"Delivery\" /> is <see cref=\"F:AmbientServices.MfaDelivery.Email\" /> or <see cref=\"F:AmbientServices.MfaDelivery.Sms\" /> or when output."
          },
          {
            "name": "sendButDontRequire",
            "type": "Boolean",
            "summary": "Whether to send but not require the MFA code.  Set this to true during email/text setup and then set this to false when they verify the OTP round-trip.  Ignored as an input."
          },
          {
            "name": "totp",
            "type": "Totp",
            "summary": "Gets a <see cref=\"P:AmbientServices.UserMfa.Totp\" /> object that can be used to give out and verify one-time tokens based on the specified secret for additional login security."
          }
        ]
      },
      {
        "name": "Totp",
        "summary": "A class that computes time-based one-time passwords.",
        "description": "Creates an RFC 6238 TOTP calculator.",
        "type": "composite",
        "members": [
          {
            "name": "currentOneTimePassword",
            "type": "Int32",
            "summary": "Gets the full OTP for the current period."
          }
        ]
      },
      {
        "name": "MfaDelivery",
        "summary": "An enumeration of ways to deliver MFA tokens to users.",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "None",
            "summary": "There is no delivery (ie. the user has a way to generate tokens such as a hardware key, an MFA app, a password manager, etc.)",
            "value": 0
          },
          {
            "name": "Email",
            "summary": "The MFA token should be delivered by email.",
            "value": 1
          },
          {
            "name": "Sms",
            "summary": "The MFA token should be delivered by SMS text message.",
            "value": 2
          }
        ]
      },
      {
        "name": "TotpEncryptionType",
        "summary": "An enumeration of TOTP encryption types.",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "SHA1",
            "summary": "SHA1 encryption type (still the only one supported by Microsoft Authenticator).",
            "value": 0
          },
          {
            "name": "SHA256",
            "summary": "SHA256 encryption type.",
            "value": 1
          },
          {
            "name": "SHA512",
            "summary": "SHA512 encryption type.",
            "value": 2
          }
        ]
      },
      {
        "name": "DeleteMfaResponse",
        "summary": "A record containing the response to a request to delete MFA configuration."
      },
      {
        "name": "CheckUserAuthenticationResponse",
        "summary": "A record containing the response to a request to check a user's authentication.",
        "type": "composite",
        "members": [
          {
            "name": "code",
            "type": "String",
            "summary": "A code to mirror the structure of an error, but whose value differs from what would be returned in an error so the client can just check the code to see if the request succeeded.  When successful, always contains \"AuthenticationVerified\"."
          },
          {
            "name": "user",
            "type": "UserData",
            "summary": "A <see cref=\"T:AmbientServices.UserData\" /> containing the authenticated user's data."
          }
        ]
      },
      {
        "name": "ListAllUsersResponse",
        "summary": "A record containing the response for <see cref=\"M:PicMeApi.AuthenticationApis.ListAllUsers(AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.Auth,PicMeApi.AuthData,System.String)\" />",
        "type": "composite",
        "members": [
          {
            "name": "userIds",
            "type": "UserId[]",
            "summary": "An array of <see cref=\"T:AmbientServices.UserId\" /> for users."
          },
          {
            "name": "continuation",
            "type": "String?",
            "summary": "A string that can be passed to a subsequent call to get the next chunk of the list."
          }
        ]
      },
      {
        "name": "InvalidateUserTokensResponse",
        "summary": "A record containing the response to a request to invalidate a user's tokens (empty)."
      },
      {
        "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": "GetRightsOnResponse",
        "summary": "A record containing indicating the rights a user has on a record.",
        "type": "composite",
        "members": [
          {
            "name": "ownership",
            "type": "LinkRelationship?",
            "summary": "The <see cref=\"T:AmbientServices.LinkRelationship\" /> indicating the ownership rights."
          },
          {
            "name": "rights",
            "type": "LinkRelationship?",
            "summary": "The <see cref=\"T:AmbientServices.LinkRelationship\" /> indicating the non-ownership rights."
          }
        ]
      },
      {
        "name": "MergeAccountsResponse",
        "summary": "A record containing the response to the <see cref=\"M:PicMeApi.AuthenticationApis.MergeAccounts(AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.Auth,PicMeModel.PicMeGlobalCounters,System.String,System.String,System.Net.IPAddress)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "mergedUserId",
            "type": "UserId",
            "summary": "The <see cref=\"T:AmbientServices.UserId\" /> of the source account that has been merged and can no longer be used."
          },
          {
            "name": "keptUserId",
            "type": "UserId",
            "summary": "The <see cref=\"T:AmbientServices.UserId\" /> of the target account which now contains the items that were in the other account."
          }
        ]
      },
      {
        "name": "AuthenticateAsGuestResponse",
        "summary": "A record containing the response to a request to create a new guest user account.",
        "type": "composite",
        "members": [
          {
            "name": "guestId",
            "type": "UserId",
            "summary": "The <see cref=\"T:AmbientServices.UserId\" /> of the guest account."
          },
          {
            "name": "guestGlobalId",
            "type": "RecordGlobalId",
            "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> of the guest account."
          },
          {
            "name": "authenticated",
            "type": "UserAuthenticated",
            "summary": "A <see cref=\"T:AmbientServices.UserAuthenticated\" /> containing information about the new user authentication."
          }
        ]
      },
      {
        "name": "UserAccountCondition",
        "summary": "A Condition that can be used to query for user accounts.  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",
            "summary": "Either a property name or the string name of a <see cref=\"P:AmbientServices.Condition.ConditionType\" />."
          },
          {
            "name": "value",
            "type": "Object?",
            "summary": "The value for the condition, which may be either of the type specified in <see cref=\"T:System.ValueType\" />, and array or Set of those, or a <see cref=\"T:AmbientServices.Condition\" /> or an array or set of conditions, depending on the <see cref=\"P:AmbientServices.Condition.ConditionType\" />."
          },
          {
            "name": "ignoreCase",
            "type": "Boolean?",
            "summary": "Whether to ignore case for the condition, depending on the <see cref=\"P:AmbientServices.Condition.ConditionType\" />."
          }
        ]
      },
      {
        "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": "ListUsersResponse",
        "summary": "A record containing the response for <see cref=\"M:PicMeApi.AuthenticationApis.ListUsers(AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.Auth,PicMeApi.AuthData,AmbientServices.UserAccountCondition,System.String,System.Int32)\" />",
        "type": "composite",
        "members": [
          {
            "name": "userAccounts",
            "type": "UserAccount[]",
            "summary": "An array of <see cref=\"T:AmbientServices.UserAccount\" />s for users."
          },
          {
            "name": "continuation",
            "type": "String?",
            "summary": "A string that can be passed to a subsequent call to get the next chunk of the list."
          }
        ]
      },
      {
        "name": "UserAccount",
        "summary": "A record that holds information about a user account.",
        "type": "composite",
        "members": [
          {
            "name": "userId",
            "type": "UserId",
            "summary": "The <see cref=\"P:AmbientServices.UserAccount.UserId\" /> for the user account.  Ignored as an input."
          },
          {
            "name": "userGlobalId",
            "type": "RecordGlobalId",
            "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the user account.  Ignored as an input."
          },
          {
            "name": "createdDate",
            "type": "DateTime",
            "summary": "The <see cref=\"T:System.DateTime\" /> when the user account was created.  Ignored as an input."
          },
          {
            "name": "modifiedDate",
            "type": "DateTime",
            "summary": "The <see cref=\"T:System.DateTime\" /> when this user account record was modified.  Ignored as an input."
          },
          {
            "name": "state",
            "type": "AccountState",
            "summary": "An <see cref=\"T:AmbientServices.AccountState\" /> indicating the state of the account.  Ignored as an input."
          },
          {
            "name": "deactivated",
            "type": "DateTime?",
            "summary": "The optional <see cref=\"T:System.DateTime\" /> when the user account was deactivated by an administrator.  Ignored as an input, unless the caller is an administrator."
          },
          {
            "name": "randomlyAssignedName",
            "type": "Boolean",
            "summary": "Whether or not the name was assigned randomly."
          },
          {
            "name": "name",
            "type": "String?",
            "summary": "The user's name (indexed as a whole)."
          },
          {
            "name": "requireMultipleVerificationsForSecurityChanges",
            "type": "Boolean",
            "summary": "Whether or not to require multiple verifications for security-related changes.  When true, security changes will require two of the following for changes to be made: password, email verification, phone verification, MFA verification, WebAuthn."
          },
          {
            "name": "email",
            "type": "String?",
            "summary": "The user's email, if any (indexed as a whole).  Not currently alterable."
          },
          {
            "name": "emailVerified",
            "type": "DateTime?",
            "summary": "The <see cref=\"T:System.DateTime\" /> when the email was verified.  Cleared when the email is changed.  Ignored as an input, but set automatically when the correct verification is provided.."
          },
          {
            "name": "emailBounced",
            "type": "DateTime?",
            "summary": "The <see cref=\"T:System.DateTime\" /> when an email bounced.  Cleared when the email is changed or when specifically reset.  When non-null, only required auth-related emails will be sent to this account until 30 days have elapsed."
          },
          {
            "name": "emailMarkedAsSpam",
            "type": "DateTime?",
            "summary": "The <see cref=\"T:System.DateTime\" /> when an email was specifically marked as spam.  Cleared when the email is changed or when specifically reset.  When non-null, only required auth-related emails will be sent to this account."
          },
          {
            "name": "phoneNumber",
            "type": "String?",
            "summary": "The user's phone number, if any (indexed as a whole).  Not currently alterable."
          },
          {
            "name": "phoneNumberVerified",
            "type": "DateTime?",
            "summary": "The <see cref=\"T:System.DateTime\" /> when the user's phone number was verified.  Cleared when the phone number is changed.  Ignored as an input, but set automatically when the correct verification is provided."
          },
          {
            "name": "phoneNumberBounced",
            "type": "DateTime?",
            "summary": "The <see cref=\"T:System.DateTime\" /> when a text message bounced.  Cleared when the phone number is changed or when specifically reset.  When non-null, only required auth-related texts will be sent to this account until 30 days have elapsed."
          },
          {
            "name": "phoneNumberMarkedAsSpam",
            "type": "DateTime?",
            "summary": "The <see cref=\"T:System.DateTime\" /> when a text message was specifically marked as spam.  Cleared when the phone number is changed or when specifically reset.  When non-null, only required auth-related texts will be sent to this account."
          },
          {
            "name": "termsOfServiceRead",
            "type": "DateTime?",
            "summary": "The <see cref=\"T:System.DateTime\" /> when the user agreed to the terms of service."
          },
          {
            "name": "externalIds",
            "type": "ExternalEntityIdentifier[]?",
            "summary": "An optional array of <see cref=\"T:AmbientServices.ExternalEntityIdentifier\" /> identifying this user account in external systems."
          },
          {
            "name": "isRegistered",
            "type": "Boolean",
            "summary": "Whether or not an account is registered (not a guest account)."
          }
        ]
      },
      {
        "name": "AccountState",
        "summary": "An enumeration of account states.\n            This enumeration is serialized, so numeric values must not change over time.",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "Unverified",
            "summary": "The account has not been verified yet, so we don't know if the user that created the account actually controls the contact inboxes.",
            "value": 0
          },
          {
            "name": "Normal",
            "summary": "The account is normal and has been verified.",
            "value": 2
          },
          {
            "name": "PasswordResetRequired",
            "summary": "The account may have been compromised and the password should be reset.",
            "value": 3
          },
          {
            "name": "Merged",
            "summary": "The account has been merged with another account.",
            "value": 4
          },
          {
            "name": "Disabled",
            "summary": "The account has been disabled.",
            "value": 5
          }
        ]
      },
      {
        "name": "CreateTotpSecretResponse",
        "summary": "A record containing the response to a request to create a TOTP secret.",
        "type": "composite",
        "members": [
          {
            "name": "encryptionType",
            "type": "TotpEncryptionType",
            "summary": "The <see cref=\"T:AmbientServices.TotpEncryptionType\" /> used for the secret, which will be needed to get the correct one-time passwords."
          },
          {
            "name": "secret",
            "type": "String",
            "summary": "The TOTP secret, encoded as a BASE-32 string."
          }
        ]
      }
    ]
  },
  {
    "endpoint": "CollectionHandler2",
    "preferredHttpPath": "/a/c",
    "alternateHttpPaths": [
      "/a/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)."
          }
        ]
      }
    ]
  },
  {
    "endpoint": "CommerceHandler",
    "preferredHttpPath": "/a/m",
    "alternateHttpPaths": [
      "/a/HttpCommerce"
    ],
    "summary": "Commerce related APIs.",
    "apis": [
      {
        "name": "GetEffectiveUserLimits",
        "httpMethod": "GET",
        "httpPathRegex": "^/effective-user-limits",
        "subPathPattern": "/effective-user-limits",
        "summary": "Gets the specified user's effective limits, computing the overlapping limits and merging them together to compute the effective limits for the next two time periods.\n            At least one set of limits will always be returned (the limits based on the default free subscription or a root subscription).\n            Multiple limit sets may be returned, in temporal order with the end time for each set.\n            Includes only the usage for currently active purchases, not past or potential future purchases (or lack thereof).",
        "parameters": [
          {
            "name": "userId",
            "required": false,
            "type": "UserId?",
            "description": "The optional <see cref=\"T:AmbientServices.UserId\" /> for the user whose limits are wanted.  If not specified, the currently-authenticated user will be used."
          },
          {
            "name": "previousEndTime",
            "required": false,
            "type": "DateTime?",
            "description": "An optional <see cref=\"T:System.DateTime\" /> whose value comes from the <see cref=\"P:PicMeModel.EffectiveUserLimits.EndTime\" /> returned in a previous call.  The limits returned in this case will apply when the *server* clock reaches this time. Must not be more than 367 days after the current UTC time."
          }
        ],
        "return": {
          "type": "GetEffectiveUserLimitsResponse",
          "description": "A <see cref=\"T:PicMeApi.GetEffectiveUserLimitsResponse\" /> containing the response."
        }
      },
      {
        "name": "GetEffectiveUserUsage",
        "httpMethod": "GET",
        "httpPathRegex": "^/effective-user-usage",
        "subPathPattern": "/effective-user-usage",
        "summary": "Gets the specified user's effective usage, computing the overlapping usage and limits and merging them together to compute the effective limits for the current time period.\n            Includes only the usage for currently active purchases, not past or potential future purchases (or lack thereof).",
        "parameters": [
          {
            "name": "userId",
            "required": false,
            "type": "UserId?",
            "description": "The optional <see cref=\"T:AmbientServices.UserId\" /> for the user whose usage and limits are wanted.  If not specified, the currently-authenticated user will be used."
          },
          {
            "name": "previousEndTime",
            "required": false,
            "type": "DateTime?",
            "description": "An optional <see cref=\"T:System.DateTime\" /> whose value comes from the <see cref=\"P:PicMeModel.EffectiveUserUsage.EndTime\" /> returned in a previous call.  The limits returned in this case will apply when the *server* clock reaches this time. Must not be more than 367 days after the current UTC time."
          }
        ],
        "return": {
          "type": "GetEffectiveUserUsageResponse",
          "description": "A <see cref=\"T:PicMeApi.GetEffectiveUserUsageResponse\" /> containing the response."
        }
      },
      {
        "name": "ListUserPurchaseChangeRecords",
        "httpMethod": "GET",
        "httpPathRegex": "^/purchase-records",
        "subPathPattern": "/purchase-records",
        "summary": "Lists all user purchase change records for the specified user.\n            Requires root administrator privileges or in dev, a Lightning Kite email account",
        "parameters": [
          {
            "name": "userId",
            "required": true,
            "type": "UserId",
            "description": "The <see cref=\"T:AmbientServices.UserId\" /> whose limits are to be retrieved."
          },
          {
            "name": "startTime",
            "required": false,
            "type": "DateTime?",
            "description": "The <see cref=\"T:System.DateTime\" /> of the earliest purchase to return (defaults to 365 days ago, compares against at <see cref=\"P:PicMeModel.UserPurchase.EndTime\" />)."
          },
          {
            "name": "purchaseMethod",
            "required": false,
            "type": "String?",
            "description": "The string to store in <see cref=\"P:PicMeModel.UserPurchase.PurchaseMethod\" />.  Defaults to null, which lists *all* purchase change records."
          }
        ],
        "return": {
          "type": "ListUserPurchaseChangeRecordsResponse",
          "description": "A <see cref=\"T:PicMeApi.ListUserPurchaseChangeRecordsResponse\" /> containing the response."
        }
      },
      {
        "name": "SynchronizeUserPurchases",
        "httpMethod": "POST",
        "httpPathRegex": "^/sync-purchases",
        "subPathPattern": "/sync-purchases",
        "summary": "Manually synchronizes user purchases from the specified external payment system to the set of user purchases with the specified purchase method (currently, only \"RevenueCat\" is valid and required).  \n            This is intended to be used as a manual backstop in case the webhooks fail for some reason, to ensure that the user's purchases are eventually consistent with the external payment system.  \n            Requires root administrator privileges or in dev, a Lightning Kite email account.",
        "parameters": [
          {
            "name": "userId",
            "required": true,
            "type": "UserId?",
            "description": "The <see cref=\"T:AmbientServices.UserId\" /> whose purchases are to be synchronized.  If not specified, uses the authenticated user."
          },
          {
            "name": "purchaseMethod",
            "required": true,
            "type": "String",
            "description": "The purchase method (currently, only \"RevenueCat\" is valid, and is required)."
          }
        ],
        "return": {
          "type": "SynchronizeUserPurchasesResponse",
          "description": "A <see cref=\"T:PicMeApi.SynchronizeUserPurchasesResponse\" /> containing the response."
        }
      },
      {
        "name": "RevenueCatWebhook",
        "httpMethod": "POST",
        "httpPathRegex": "^/revenuecat",
        "subPathPattern": "/revenuecat",
        "summary": "The webhook for RevenueCat.\n            Called by RevenueCat using the secret key configured in RevenueCat, or by a root administrator.\n            Synchronizes purchases for the indicated user(s) by syncing from RevenueCat (or IExternalPaymentVerification) to purchases with the the \"RevenueCat\" purchase method for the indicated user(s).",
        "parameters": [
          {
            "name": "body",
            "required": true,
            "type": "RevenueCatWebhookPostData",
            "description": "The body of the POST."
          }
        ],
        "return": {
          "type": "RevenueCatWebhookResponse",
          "description": "A <see cref=\"T:PicMeApi.RevenueCatWebhookResponse\" /> containing the response."
        }
      },
      {
        "name": "CreateUserPurchase",
        "httpMethod": "POST",
        "httpPathRegex": "^/purchase",
        "subPathPattern": "/purchase",
        "summary": "Creates a purchase for a specific user.\n            Requires root administrator privileges or in dev, a Lightning Kite email account.",
        "parameters": [
          {
            "name": "startTime",
            "required": true,
            "type": "DateTime",
            "description": "The <see cref=\"T:System.DateTime\" /> the subscription is to start (the end time will be determined by the properties of the product)."
          },
          {
            "name": "productId",
            "required": false,
            "type": "String?",
            "description": "The optional ID of a pre-existing product to be \"purchased\"."
          },
          {
            "name": "product",
            "required": false,
            "type": "Product?",
            "description": "If <paramref name=\"productId\" /> is not specified, the custom product to be \"purchased\".  For custom products, use an empty Product ID so that a unique one will be assigned to prevent conflicts with historical, existing, and future products."
          },
          {
            "name": "emailOrPhoneNumber",
            "required": false,
            "type": "String?",
            "description": "The email or phone number of the user whose limits are to be set.  Either this or <paramref name=\"userId\" /> must be set."
          },
          {
            "name": "userId",
            "required": false,
            "type": "UserId?",
            "description": "The <see cref=\"T:AmbientServices.UserId\" /> whose limits are to be set.  Either this or <paramref name=\"emailOrPhoneNumber\" /> must be set."
          },
          {
            "name": "purchaseMethod",
            "required": false,
            "type": "String",
            "description": "The string to store in <see cref=\"P:PicMeModel.UserPurchase.PurchaseMethod\" />.  Defaults to \"Admin\"."
          }
        ],
        "return": {
          "type": "CreateUserPurchaseResponse",
          "description": "A <see cref=\"T:PicMeApi.CreateUserPurchaseResponse\" /> containing the response."
        }
      },
      {
        "name": "PutUserPurchase",
        "httpMethod": "PUT",
        "httpPathRegex": "^/purchase",
        "subPathPattern": "/purchase",
        "summary": "Puts a new purchase for the user (with the option to cancel any previous purchases of a similar type).\n            Requires root administrator privileges or in dev, a Lightning Kite email account.",
        "parameters": [
          {
            "name": "startTime",
            "required": true,
            "type": "DateTime",
            "description": "The <see cref=\"T:System.DateTime\" /> the subscription is to start (the end time will be determined by the properties of the product)."
          },
          {
            "name": "cancelAnyOtherActiveSubscriptions",
            "required": true,
            "type": "Boolean",
            "description": "Whether to cancel any active subscriptions from the specified purchase method."
          },
          {
            "name": "cancelAnyOtherActiveNonSubscriptions",
            "required": true,
            "type": "Boolean",
            "description": "Whether to cancel any active non-subscriptions from the specified purchase method."
          },
          {
            "name": "productId",
            "required": false,
            "type": "String?",
            "description": "The optional ID of a pre-existing product to be \"purchased\"."
          },
          {
            "name": "product",
            "required": false,
            "type": "Product?",
            "description": "If <paramref name=\"productId\" /> is not specified, the custom product to be \"purchased\".  For custom products, use an empty Product ID so that a unique one will be assigned to prevent conflicts with historical, existing, and future products."
          },
          {
            "name": "userId",
            "required": false,
            "type": "UserId?",
            "description": "The <see cref=\"T:AmbientServices.UserId\" /> whose limits are to be set.  Either this or <paramref name=\"emailOrPhoneNumber\" /> must be set."
          },
          {
            "name": "emailOrPhoneNumber",
            "required": false,
            "type": "String?",
            "description": "The email or phone number of the user whose limits are to be set.  Either this or <paramref name=\"userId\" /> must be set."
          },
          {
            "name": "purchaseMethod",
            "required": false,
            "type": "String",
            "description": "The string to store in <see cref=\"P:PicMeModel.UserPurchase.PurchaseMethod\" />.  Defaults to \"Admin\"."
          }
        ],
        "return": {
          "type": "PutUserPurchaseResponse",
          "description": "A <see cref=\"T:PicMeApi.PutUserPurchaseResponse\" /> containing the response."
        }
      },
      {
        "name": "ListUserPurchases",
        "httpMethod": "GET",
        "httpPathRegex": "^/purchase",
        "subPathPattern": "/purchase",
        "summary": "Lists all user purchases.  Does *not* list default subscriptions.\n            When specifying a user, requires root administrator privileges or in dev, a Lightning Kite email account",
        "parameters": [
          {
            "name": "userId",
            "required": false,
            "type": "UserId?",
            "description": "The <see cref=\"T:AmbientServices.UserId\" /> whose limits are to be retrieved (must be root admin).  When not specified, gets the purchases for the currently-authenticated user."
          },
          {
            "name": "startTime",
            "required": false,
            "type": "DateTime?",
            "description": "The <see cref=\"T:System.DateTime\" /> of the earliest purchase to return (defaults to yesterday, compares against at <see cref=\"P:PicMeModel.UserPurchase.EndTime\" />)."
          },
          {
            "name": "includeCancelledPurchases",
            "required": false,
            "type": "Boolean",
            "description": "Whether to include cancelled purchases in the response."
          },
          {
            "name": "purchaseMethod",
            "required": false,
            "type": "String?",
            "description": "The string to store in <see cref=\"P:PicMeModel.UserPurchase.PurchaseMethod\" />.  Defaults to null, which lists *all* purchases."
          }
        ],
        "return": {
          "type": "ListUserPurchasesResponse",
          "description": "A <see cref=\"T:PicMeApi.ListUserPurchasesResponse\" /> containing the response."
        }
      },
      {
        "name": "CancelUserPurchase",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/purchase",
        "subPathPattern": "/purchase",
        "summary": "Cancels the specified purchase with the specified purchase method.\n            Requires root administrator privileges or in dev, a Lightning Kite email account.",
        "parameters": [
          {
            "name": "purchaseId",
            "required": true,
            "type": "UserPurchaseId",
            "description": "The unique identifier for the purchase."
          },
          {
            "name": "purchaseMethod",
            "required": false,
            "type": "String",
            "description": "The string indicating the <see cref=\"P:PicMeModel.UserPurchase.PurchaseMethod\" /> of the purchase to be cancelled.  Defaults to \"Admin\"."
          },
          {
            "name": "userId",
            "required": false,
            "type": "UserId?",
            "description": "The <see cref=\"T:AmbientServices.UserId\" /> whose limits are to be set.  Either this or <paramref name=\"emailOrPhoneNumber\" /> must be set."
          },
          {
            "name": "emailOrPhoneNumber",
            "required": false,
            "type": "String?",
            "description": "The email or phone number of the user whose limits are to be set.  Either this or <paramref name=\"userId\" /> must be set."
          }
        ],
        "return": {
          "type": "CancelUserPurchaseResponse",
          "description": "A <see cref=\"T:PicMeApi.CancelUserPurchaseResponse\" /> containing the response."
        }
      },
      {
        "name": "ListAvailableProducts",
        "httpMethod": "GET",
        "httpPathRegex": "^/product",
        "subPathPattern": "/product",
        "summary": "Lists all available products with their names, prices, limits, recurrence, etc.",
        "parameters": [
          {
            "name": "includeSubscriptions",
            "required": false,
            "type": "Boolean",
            "description": "Whether to include subscription products (defaults to true)."
          },
          {
            "name": "includeNonSubscriptions",
            "required": false,
            "type": "Boolean",
            "description": "Whether to include non-subscription products (defaults to true)."
          }
        ],
        "return": {
          "type": "ListAvailableProductsResponse",
          "description": "A <see cref=\"T:PicMeApi.ListAvailableProductsResponse\" /> containing the response."
        }
      },
      {
        "name": "CreateTestProduct",
        "httpMethod": "POST",
        "httpPathRegex": "^/product",
        "subPathPattern": "/product",
        "summary": "Creates a product for purchase.  (For testing only).\n            Requires root administrator privileges.",
        "parameters": [
          {
            "name": "body",
            "required": true,
            "type": "Product",
            "description": "The <see cref=\"T:PicMeModel.Product\" />."
          }
        ],
        "return": {
          "type": "CreateTestProductResponse",
          "description": "A <see cref=\"T:PicMeApi.CreateTestProductResponse\" /> containing the response."
        }
      }
    ],
    "types": [
      {
        "name": "UserId",
        "summary": "A struct that holds a user identifier.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "GetEffectiveUserLimitsResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CommerceApis.GetEffectiveUserLimits(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,PicMeApi.AuthData,System.Nullable{AmbientServices.UserId},System.Nullable{System.DateTime})\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "effectiveUserLimits",
            "type": "EffectiveUserLimits[]",
            "summary": "An array of <see cref=\"P:PicMeApi.GetEffectiveUserLimitsResponse.EffectiveUserLimits\" /> for the specified user, starting with the currently-effective one."
          }
        ]
      },
      {
        "name": "EffectiveUserLimits",
        "summary": "A record containing information about the effective user limits, combining multiple purchases if needed.",
        "type": "composite",
        "members": [
          {
            "name": "freeUser",
            "type": "Boolean",
            "summary": "Whether the user is a free user or not."
          },
          {
            "name": "ids",
            "type": "String",
            "summary": "A list of product IDs"
          },
          {
            "name": "names",
            "type": "String",
            "summary": "The names of the products."
          },
          {
            "name": "ads",
            "type": "SubscriptionAds",
            "summary": "A <see cref=\"T:PicMeModel.SubscriptionAds\" /> indicating which ads should be suppressed."
          },
          {
            "name": "maxCollections",
            "type": "Int32",
            "summary": "The maximum number of collections allowed."
          },
          {
            "name": "maxStorageBytes",
            "type": "Int64",
            "summary": "The number of storage bytes allowed during this period."
          },
          {
            "name": "maxDownloadBytes",
            "type": "Int64",
            "summary": "The data transfer bytes available during this period."
          },
          {
            "name": "maxUploadsPerCollection",
            "type": "Int32",
            "summary": "The maximum number of uploads per collection under this plan."
          },
          {
            "name": "maxUploadSizeBytes",
            "type": "Int64",
            "summary": "The maximum number of bytes for any given upload."
          },
          {
            "name": "maxBytesPerCollection",
            "type": "Int64",
            "summary": "The maximum number of bytes per collection under this plan."
          },
          {
            "name": "endTime",
            "type": "DateTime",
            "summary": "The end time for these limits."
          }
        ]
      },
      {
        "name": "SubscriptionAds",
        "summary": "An enumeration of flags (ORable) indicating which ads should be suppressed.",
        "type": "enum",
        "flags": true,
        "enumValues": [
          {
            "name": "AllAds",
            "summary": "All ads should be displayed.",
            "value": 0
          },
          {
            "name": "NoInterstitialAds",
            "summary": "No interstitial ads should be displayed.",
            "value": 1
          },
          {
            "name": "NoProgessAds",
            "summary": "No ads should be displayed on progress dialogs.",
            "value": 2
          },
          {
            "name": "NoAds",
            "summary": "No ads of any kind should ever be displayed.",
            "value": -1
          }
        ]
      },
      {
        "name": "GetEffectiveUserUsageResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CommerceApis.GetEffectiveUserUsage(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,PicMeApi.AuthData,System.Nullable{AmbientServices.UserId},System.Nullable{System.DateTime})\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "activePurchases",
            "type": "UserPurchase[]",
            "summary": "An array containing the active <see cref=\"T:PicMeModel.UserPurchase\" />s."
          },
          {
            "name": "effectiveUserUsage",
            "type": "EffectiveUserUsage[]",
            "summary": "An array of <see cref=\"P:PicMeApi.GetEffectiveUserUsageResponse.EffectiveUserUsage\" /> for the specified user."
          }
        ]
      },
      {
        "name": "EffectiveUserUsage",
        "summary": "A record containing information about the user's effective usage measured against effective limits.",
        "type": "composite",
        "members": [
          {
            "name": "userPurchaseId",
            "type": "UserPurchaseId",
            "summary": "The <see cref=\"P:PicMeModel.EffectiveUserUsage.UserPurchaseId\" /> of the purchase these limits and usage are associated with."
          },
          {
            "name": "userPurchaseGlobalId",
            "type": "RecordGlobalId",
            "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> of the purchase these limits and usage are associated with."
          },
          {
            "name": "collections",
            "type": "Int32",
            "summary": "The number of collections used."
          },
          {
            "name": "collectionsAllowed",
            "type": "Int32",
            "summary": "The number of collections allowed."
          },
          {
            "name": "uploads",
            "type": "Int32",
            "summary": "The number of uploads used."
          },
          {
            "name": "uploadsAllowed",
            "type": "Int32",
            "summary": "The number of uploads allowed."
          },
          {
            "name": "storageBytes",
            "type": "Int64",
            "summary": "The number of storage bytes used."
          },
          {
            "name": "storageBytesAllowed",
            "type": "Int64",
            "summary": "The number of storage bytes allowed during this period."
          },
          {
            "name": "downloadBytes",
            "type": "Int64",
            "summary": "The data transfer bytes used."
          },
          {
            "name": "downloadBytesAllowed",
            "type": "Int64",
            "summary": "The data transfer bytes available during this period."
          },
          {
            "name": "endTime",
            "type": "DateTime",
            "summary": "The time when this usage or the limits expire.  Not necessarily when the purchase expires, but the end of the time period during which there is no change in overlapping products, after which limits may change or usage may be allocated differently."
          }
        ]
      },
      {
        "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": "UserPurchase",
        "summary": "A record containing information about a purchase that is either active or was previously active.",
        "type": "composite",
        "members": [
          {
            "name": "userPurchaseId",
            "type": "UserPurchaseId",
            "summary": "The <see cref=\"P:PicMeModel.UserPurchase.UserPurchaseId\" /> for the purchase."
          },
          {
            "name": "userPurchaseGlobalId",
            "type": "RecordGlobalId",
            "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the purchase."
          },
          {
            "name": "purchaseTime",
            "type": "DateTime",
            "summary": "The time this product was purchased."
          },
          {
            "name": "startTime",
            "type": "DateTime",
            "summary": "The start time for this purchase."
          },
          {
            "name": "endTime",
            "type": "DateTime",
            "summary": "The end time for the this purchase.  If this is less than the normal end time as calculated from the <see cref=\"P:PicMeModel.UserPurchase.StartTime\" /> and <see cref=\"P:PicMeModel.Product.Duration\" />, it was cancelled early."
          },
          {
            "name": "product",
            "type": "Product",
            "summary": "The <see cref=\"T:PicMeModel.Product\" /> indicating what was purchased."
          },
          {
            "name": "cancellationTime",
            "type": "DateTime?",
            "summary": "The time when the purchase was cancelled (not the end time).  Defaults to null, which means that the purchase was not cancelled."
          },
          {
            "name": "purchaseMethod",
            "type": "String?",
            "summary": "The purchase method (App Store, Play Store, RevenueCat, Admin, etc.)."
          },
          {
            "name": "paymentSystemProductId",
            "type": "String?",
            "summary": "The store-specific product identifier from the payment system in case the purchase is cancelled or restored.  In the case of RevenueCat, this is the store-specific product identifier (e.g. \"S01\") that appears as product_identifier in the subscriber API."
          },
          {
            "name": "transactionId",
            "type": "String?",
            "summary": "The transaction ID from the store, if known."
          }
        ]
      },
      {
        "name": "ListUserPurchaseChangeRecordsResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CommerceApis.ListUserPurchaseChangeRecords(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,System.String,PicMeApi.AuthData,AmbientServices.UserId,System.Nullable{System.DateTime},System.String)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "userPurchaseChangeRecords",
            "type": "UserPurchaseChangeKeyWithValue[]",
            "summary": "An array of <see cref=\"T:PicMeApi.UserPurchaseChangeKeyWithValue\" /> for the specified user."
          }
        ]
      },
      {
        "name": "UserPurchaseChangeKeyWithValue",
        "summary": "A record containing a <see cref=\"T:PicMeLogic.UserPurchaseChangeKey\" /> and its associated <see cref=\"T:PicMeLogic.UserPurchaseChangeRecord\" />.",
        "type": "composite",
        "members": [
          {
            "name": "key",
            "type": "UserPurchaseChangeKey",
            "summary": "The <see cref=\"T:PicMeLogic.UserPurchaseChangeKey\" />."
          },
          {
            "name": "value",
            "type": "UserPurchaseChangeRecord",
            "summary": "The associated <see cref=\"T:PicMeLogic.UserPurchaseChangeRecord\" />."
          }
        ]
      },
      {
        "name": "UserPurchaseChangeRecord",
        "summary": "A record that captures a change in a user's purchase.",
        "type": "composite",
        "members": [
          {
            "name": "oldPurchase",
            "type": "UserPurchase?",
            "summary": "Gets the old <see cref=\"T:PicMeModel.UserPurchase\" /> (if any)."
          },
          {
            "name": "newPurchase",
            "type": "UserPurchase?",
            "summary": "Gets the new <see cref=\"T:PicMeModel.UserPurchase\" /> (if any)."
          },
          {
            "name": "changeReason",
            "type": "String",
            "summary": "Gets the textual description of the reason for the change."
          },
          {
            "name": "changeAgent",
            "type": "String",
            "summary": "Gets a textual description of the agent responsible for the change."
          },
          {
            "name": "contextLogPairs",
            "type": "IEnumerable\u00601",
            "summary": "Gets an enumeration of <see cref=\"T:AmbientServices.LogContextEntry\" /> representing the context log pairs captured at the time of the change record's creation."
          }
        ]
      },
      {
        "name": "IEnumerable\u00601"
      },
      {
        "name": "UserPurchaseChangeKey",
        "summary": "A record that captures a change in a user's purchase.",
        "type": "composite",
        "members": [
          {
            "name": "userId",
            "type": "UserId",
            "summary": "The <see cref=\"P:PicMeLogic.UserPurchaseChangeKey.UserId\" /> of the user whose purchase changed."
          },
          {
            "name": "changeTime",
            "type": "DateTime",
            "summary": "The time of the change."
          }
        ]
      },
      {
        "name": "SynchronizeUserPurchasesResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CommerceApis.SynchronizeUserPurchases(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,AmbientServices.IExternalPaymentVerification,System.String,PicMeApi.AuthData,System.Nullable{AmbientServices.UserId},System.String)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "purchases",
            "type": "UserPurchase[]",
            "summary": "An array of the synchronized purchases using the specified purchase method."
          }
        ]
      },
      {
        "name": "RevenueCatWebhookPostData",
        "type": "composite",
        "members": [
          {
            "name": "event",
            "type": "RevenueCatEventData"
          },
          {
            "name": "apiVersion",
            "type": "String?"
          }
        ]
      },
      {
        "name": "RevenueCatEventData",
        "type": "composite",
        "members": [
          {
            "name": "type",
            "type": "RevenueCatEventType"
          },
          {
            "name": "id",
            "type": "String"
          },
          {
            "name": "appUserId",
            "type": "String?"
          },
          {
            "name": "environment",
            "type": "RevenueCatEnvironment"
          },
          {
            "name": "eventTimestampMs",
            "type": "Int64?"
          },
          {
            "name": "purchasedAtMs",
            "type": "Int64?"
          },
          {
            "name": "productId",
            "type": "String?"
          },
          {
            "name": "entitlementIds",
            "type": "String[]?"
          },
          {
            "name": "originalPurchaseDate",
            "type": "DateTime?"
          },
          {
            "name": "expirationAtMs",
            "type": "Int64?"
          },
          {
            "name": "store",
            "type": "RevenueCatStore?"
          },
          {
            "name": "isTrialConversion",
            "type": "Boolean?"
          },
          {
            "name": "isFamilyShare",
            "type": "Boolean?"
          },
          {
            "name": "cancelReason",
            "type": "String?"
          },
          {
            "name": "subscriberAttributes",
            "type": "Dictionary\u00602?"
          },
          {
            "name": "appId",
            "type": "String?"
          },
          {
            "name": "renewalNumber",
            "type": "Int32?"
          },
          {
            "name": "transactionId",
            "type": "String?"
          },
          {
            "name": "originalTransactionId",
            "type": "String?"
          },
          {
            "name": "countryCode",
            "type": "String?"
          },
          {
            "name": "currency",
            "type": "String?"
          },
          {
            "name": "price",
            "type": "Single?"
          },
          {
            "name": "priceInPurchasedCurrency",
            "type": "Single?"
          },
          {
            "name": "transferredFrom",
            "type": "String[]?"
          },
          {
            "name": "transferredTo",
            "type": "String[]?"
          }
        ]
      },
      {
        "name": "Dictionary\u00602",
        "type": "composite",
        "members": [
          {
            "name": "comparer",
            "type": "IEqualityComparer\u00601"
          },
          {
            "name": "count",
            "type": "Int32"
          },
          {
            "name": "capacity",
            "type": "Int32"
          },
          {
            "name": "keys",
            "type": "KeyCollection"
          },
          {
            "name": "values",
            "type": "ValueCollection"
          },
          {
            "name": "item",
            "type": "RevenueCatSubscriberAttribute?"
          }
        ]
      },
      {
        "name": "RevenueCatSubscriberAttribute",
        "type": "composite",
        "members": [
          {
            "name": "updatedAtMs",
            "type": "Int64"
          },
          {
            "name": "value",
            "type": "String"
          }
        ]
      },
      {
        "name": "ValueCollection",
        "type": "composite",
        "members": [
          {
            "name": "count",
            "type": "Int32"
          }
        ]
      },
      {
        "name": "KeyCollection",
        "type": "composite",
        "members": [
          {
            "name": "count",
            "type": "Int32"
          }
        ]
      },
      {
        "name": "IEqualityComparer\u00601"
      },
      {
        "name": "RevenueCatStore",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "Amazon",
            "value": 0
          },
          {
            "name": "AppStore",
            "value": 1
          },
          {
            "name": "External",
            "value": 2
          },
          {
            "name": "MacAppStore",
            "value": 3
          },
          {
            "name": "Paddle",
            "value": 4
          },
          {
            "name": "PlayStore",
            "value": 5
          },
          {
            "name": "Promotional",
            "value": 6
          },
          {
            "name": "RcBilling",
            "value": 7
          },
          {
            "name": "Stripe",
            "value": 8
          },
          {
            "name": "UnknownStore",
            "value": 9
          }
        ]
      },
      {
        "name": "RevenueCatEnvironment",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "Production",
            "value": 0
          },
          {
            "name": "Sandbox",
            "value": 1
          }
        ]
      },
      {
        "name": "RevenueCatEventType",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "Test",
            "value": 0
          },
          {
            "name": "InitialPurchase",
            "value": 1
          },
          {
            "name": "Renewal",
            "value": 2
          },
          {
            "name": "Cancellation",
            "value": 3
          },
          {
            "name": "Uncancellation",
            "value": 4
          },
          {
            "name": "NonRenewingPurchase",
            "value": 5
          },
          {
            "name": "SubscriptionPaused",
            "value": 6
          },
          {
            "name": "Expiration",
            "value": 7
          },
          {
            "name": "BillingIssue",
            "value": 8
          },
          {
            "name": "ProductChange",
            "value": 9
          },
          {
            "name": "Transfer",
            "value": 10
          },
          {
            "name": "SubscriptionExtended",
            "value": 11
          },
          {
            "name": "TemporaryEntitlementGrant",
            "value": 12
          },
          {
            "name": "RefundReversed",
            "value": 13
          },
          {
            "name": "InvoiceIssuance",
            "value": 14
          },
          {
            "name": "VirtualCurrencyTransaction",
            "value": 15
          }
        ]
      },
      {
        "name": "RevenueCatWebhookResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CommerceApis.RevenueCatWebhook(System.Collections.Generic.IDictionary{System.String,System.String},AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.ExternalEncryptionKeyManager,AmbientServices.IExternalPaymentVerification,AmbientServices.IAmbientAtomicCache,System.String,System.Text.Json.JsonDocument,PicMeApi.AuthData)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "updatedPurchases",
            "type": "UserPurchase[]",
            "summary": "An array of <see cref=\"T:PicMeModel.UserPurchase\" />s with updated values."
          }
        ]
      },
      {
        "name": "Product",
        "summary": "A record containing information about an available product.",
        "type": "composite",
        "members": [
          {
            "name": "id",
            "type": "String",
            "summary": "A unique identifier for the plan.  This can be used as a SKU, as it should always represent a specific set of privileges/limits and timeframe."
          },
          {
            "name": "name",
            "type": "String",
            "summary": "The name of the plan."
          },
          {
            "name": "subscription",
            "type": "Boolean",
            "summary": "Whether this product is a one-time purchase or a subscription."
          },
          {
            "name": "duration",
            "type": "PurchaseDuration",
            "summary": "A <see cref=\"T:PicMeModel.PurchaseDuration\" /> indicating how long the purchase will last."
          },
          {
            "name": "price",
            "type": "Single",
            "summary": "The price (in US dollars) for this subscription, if applicable."
          },
          {
            "name": "ads",
            "type": "SubscriptionAds",
            "summary": "A <see cref=\"T:PicMeModel.SubscriptionAds\" /> indicating which ads should be suppressed."
          },
          {
            "name": "additionalCollections",
            "type": "Int32",
            "summary": "Allows more collections for the purchaser."
          },
          {
            "name": "additionalUploads",
            "type": "Int32",
            "summary": "Allows more total uploads for the purchaser."
          },
          {
            "name": "additionalStorageBytes",
            "type": "Int64",
            "summary": "The number of storage bytes allowed under this plan."
          },
          {
            "name": "additionalDownloadBytes",
            "type": "Int64",
            "summary": "The data transfer bytes available under this plan."
          },
          {
            "name": "maxUploadsPerCollection",
            "type": "Int32",
            "summary": "The maximum number of uploads per collection under this plan."
          },
          {
            "name": "maxUploadSizeBytes",
            "type": "Int64",
            "summary": "The maximum number of bytes for any given upload."
          },
          {
            "name": "maxBytesPerCollection",
            "type": "Int64",
            "summary": "The maximum number of bytes per collection under this plan."
          },
          {
            "name": "paymentSystemSubscriptionIds",
            "type": "String[]?",
            "summary": "An array of subscription IDs in the external payment system identifying subscription products.  If null or empty, assumes this product cannot be purchased through an external payment processor and can only be activated by system administrators.  In the case of RevenueCat, this is the user-configured (but immutable) entitlement ID that appears as the property name in the subscriptions dictionary and in the product_id in the entitlements dictionary.  It is *NOT* the identifier that starts with a prefix of entl or prod, but including those here too is recommeneded."
          },
          {
            "name": "paymentSystemNonSubscriptionIds",
            "type": "String[]?",
            "summary": "An array of product identifiers in the external payment system identifying non-subscription products.  If *any* of these match an incoming purchase notification or a synchronization query shows one of these in a purchase, this product will be mapped to that purchase.  In the case of RevenueCat, this is the user-configured (but immutable) entitlement ID that appears as the property name in the non_subscriptions dictionary.  It is *NOT* the identifier that starts with a prefix of entl or prod, but including those here too is recommeneded (though having a non-subscription with an entl prefix would be bad)."
          },
          {
            "name": "trackingDuration",
            "type": "PurchaseDuration?",
            "summary": "Optional duration used to split usage tracking into time periods.  When null (default), usage is tracked using the same duration as the product (<see cref=\"P:PicMeModel.Product.Duration\" />).  When set, a single purchase can span multiple tracking periods (e.g. a one-year purchase with OneMonth tracking has 12 periods)."
          }
        ]
      },
      {
        "name": "PurchaseDuration",
        "summary": "An enumeration of purchase durations.",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "NotApplicable",
            "summary": "Duration doesn't apply to this purchase.",
            "value": 0
          },
          {
            "name": "OneDay",
            "summary": "The purchase lasts for one day.",
            "value": 1
          },
          {
            "name": "TwoDays",
            "summary": "The purchase lasts for two days.",
            "value": 2
          },
          {
            "name": "FiveDays",
            "summary": "The purchase lasts for five days.",
            "value": 5
          },
          {
            "name": "TenDays",
            "summary": "The purchase lasts for ten days.",
            "value": 10
          },
          {
            "name": "OneMonth",
            "summary": "The purchase lasts for one month.",
            "value": 30
          },
          {
            "name": "ThreeMonths",
            "summary": "The purchase lasts for three months.",
            "value": 90
          },
          {
            "name": "SixMonths",
            "summary": "The purchase lasts for six months.",
            "value": 180
          },
          {
            "name": "OneYear",
            "summary": "The purchase lasts for one year.",
            "value": 365
          },
          {
            "name": "Unlimited",
            "summary": "The purchase lasts forever.",
            "value": -1
          }
        ]
      },
      {
        "name": "CreateUserPurchaseResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CommerceApis.CreateUserPurchase(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,System.String,PicMeApi.AuthData,System.DateTime,System.String,PicMeModel.Product,System.String,System.Nullable{AmbientServices.UserId},System.String)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "createdUserPurchase",
            "type": "UserPurchase",
            "summary": "The <see cref=\"T:PicMeModel.UserPurchase\" /> that was created."
          }
        ]
      },
      {
        "name": "PutUserPurchaseResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CommerceApis.PutUserPurchase(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,System.String,PicMeApi.AuthData,System.DateTime,System.Boolean,System.Boolean,System.String,PicMeModel.Product,System.Nullable{AmbientServices.UserId},System.String,System.String)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "createdUserPurchase",
            "type": "UserPurchase",
            "summary": "The <see cref=\"T:PicMeModel.UserPurchase\" /> that was created."
          },
          {
            "name": "cancelledPurchases",
            "type": "UserPurchase[]",
            "summary": "An array of <see cref=\"T:PicMeModel.UserPurchase\" /> that were canceled."
          }
        ]
      },
      {
        "name": "ListUserPurchasesResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CommerceApis.ListUserPurchases(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,System.String,PicMeApi.AuthData,System.Nullable{AmbientServices.UserId},System.Nullable{System.DateTime},System.Boolean,System.String)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "userPurchases",
            "type": "UserPurchase[]",
            "summary": "An array of <see cref=\"T:PicMeModel.UserPurchase\" /> for the specified user."
          }
        ]
      },
      {
        "name": "UserPurchaseId",
        "summary": "A struct that holds a user purchase id.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "CancelUserPurchaseResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CommerceApis.CancelUserPurchase(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,System.String,PicMeApi.AuthData,AmbientServices.UserPurchaseId,System.String,System.Nullable{AmbientServices.UserId},System.String)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "cancelledUserPurchase",
            "type": "UserPurchase?",
            "summary": "The <see cref=\"T:PicMeModel.UserPurchase\" /> that was canceled."
          }
        ]
      },
      {
        "name": "ListAvailableProductsResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CommerceApis.ListAvailableProducts(AmbientServices.Database,System.Boolean,System.Boolean)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "products",
            "type": "Product[]",
            "summary": "A list of <see cref=\"T:PicMeModel.Product\" /> with information about an available product."
          }
        ]
      },
      {
        "name": "CreateTestProductResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.CommerceApis.CreateTestProduct(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.IAmbientAtomicCache,System.String,PicMeApi.AuthData,PicMeModel.Product)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "product",
            "type": "Product",
            "summary": "The <see cref=\"P:PicMeApi.CreateTestProductResponse.Product\" /> that was created."
          }
        ]
      }
    ]
  },
  {
    "endpoint": "DiscussionHandler",
    "preferredHttpPath": "/a/d",
    "alternateHttpPaths": [
      "/a/HttpDiscussion"
    ],
    "summary": "Discussion-related APIs.",
    "description": "Like Polls, discussions can be standalone or implicitly associated with another entity.\n            Standalone discussions have a topic, implicit discussions are implicitly about the other entity.\n            Either type of discussion is associated with a list of messages.\n            If desired, a discussion message can be the root of a discussion, thereby creating a threaded discussion.\n            To create a subthread, use \u003Csee cref=\u0022M:PicMeApi.DiscussionApis.CreateDiscussionMessage(AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.RecordTypeId,System.String,PicMeApi.CreateDiscussionMessageBody)\u0022 /\u003E, passing the message\u0027s global ID scope as the scope, the message\u0027s global ID type as the type, and the message\u0027s regular ID as the entity id.\n            Discussion messages can be listed up to 1000 at a time.\n            Message are stored with the most *recent* message first.",
    "apis": [
      {
        "name": "PatchDiscussionMessage",
        "httpMethod": "PATCH",
        "httpPathRegex": "^/dm/(?<scope>[^?/&]+)/(?<discussionOrEntityTypeId>[^?/&]+)/(?<discussionOrEntityId>[^?/&]+)/(?<discussionMessageId>[^?/&]+)",
        "subPathPattern": "/dm/{scope}/{discussionOrEntityTypeId}/{discussionOrEntityId}/{discussionMessageId}",
        "summary": "Patches a previously-posted discussion message.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "discussionOrEntityTypeId",
            "required": true,
            "type": "RecordTypeId",
            "description": "The <see cref=\"T:AmbientServices.RecordTypeId\" /> of the entity indicated by <paramref name=\"discussionOrEntityId\" />."
          },
          {
            "name": "discussionOrEntityId",
            "required": true,
            "type": "String",
            "description": "A string that is either a <see cref=\"T:AmbientServices.DiscussionId\" /> or another entity ID for which selections can be made."
          },
          {
            "name": "discussionMessageId",
            "required": true,
            "type": "DiscussionMessageId",
            "description": "The <see cref=\"T:AmbientServices.DiscussionMessageId\" /> identifying the discussion message."
          },
          {
            "name": "body",
            "required": true,
            "type": "PatchDiscussionMessageBody",
            "description": "The <see cref=\"T:PicMeApi.PatchDiscussionMessageBody\" /> containing the partial new discussion message data."
          }
        ],
        "return": {
          "type": "PatchDiscussionMessageResponse",
          "description": "A <see cref=\"T:PicMeApi.PatchDiscussionMessageResponse\" /> containing the response."
        }
      },
      {
        "name": "DeleteDiscussionMessage",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/dm/(?<scope>[^?/&]+)/(?<discussionOrEntityTypeId>[^?/&]+)/(?<discussionOrEntityId>[^?/&]+)/(?<discussionMessageId>[^?/&]+)",
        "subPathPattern": "/dm/{scope}/{discussionOrEntityTypeId}/{discussionOrEntityId}/{discussionMessageId}",
        "summary": "Deletes a discussion message.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "discussionOrEntityTypeId",
            "required": true,
            "type": "RecordTypeId",
            "description": "The <see cref=\"T:AmbientServices.RecordTypeId\" /> of the entity indicated by <paramref name=\"discussionOrEntityId\" />."
          },
          {
            "name": "discussionOrEntityId",
            "required": true,
            "type": "String",
            "description": "A string that is either a <see cref=\"T:AmbientServices.DiscussionId\" /> or another entity ID for which selections can be made."
          },
          {
            "name": "discussionMessageId",
            "required": true,
            "type": "DiscussionMessageId",
            "description": "The <see cref=\"T:AmbientServices.DiscussionMessageId\" /> identifying the discussion message."
          }
        ],
        "return": {
          "type": "DeleteDiscussionMessageResponse",
          "description": "The <see cref=\"T:PicMeApi.DeleteDiscussionMessageResponse\" /> containing the response."
        }
      },
      {
        "name": "CreateDiscussionMessage",
        "httpMethod": "POST",
        "httpPathRegex": "^/dm/(?<scope>[^?/&]+)/(?<discussionOrEntityTypeId>[^?/&]+)/(?<discussionOrEntityId>[^?/&]+)",
        "subPathPattern": "/dm/{scope}/{discussionOrEntityTypeId}/{discussionOrEntityId}",
        "summary": "Creates a discussion message.",
        "description": "To create a thread of replies to another discussion message, use the root message's global ID scope as the scope, the root message's global ID type as the type, and the root message's regular ID as the entity id.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "discussionOrEntityTypeId",
            "required": true,
            "type": "RecordTypeId",
            "description": "The <see cref=\"T:AmbientServices.RecordTypeId\" /> of the entity indicated by <paramref name=\"discussionOrEntityId\" />."
          },
          {
            "name": "discussionOrEntityId",
            "required": true,
            "type": "String",
            "description": "A string that is either a <see cref=\"T:AmbientServices.DiscussionId\" /> or another entity ID for which selections can be made."
          },
          {
            "name": "body",
            "required": true,
            "type": "CreateDiscussionMessageBody",
            "description": "The <see cref=\"T:PicMeApi.CreateDiscussionMessageBody\" /> from the body of the request."
          }
        ],
        "return": {
          "type": "CreateDiscussionMessageResponse",
          "description": "A <see cref=\"T:PicMeApi.CreateDiscussionMessageResponse\" /> with the response."
        }
      },
      {
        "name": "ListDiscussionMessages",
        "httpMethod": "GET",
        "httpPathRegex": "^/dm/(?<scope>[^?/&]+)/(?<discussionOrEntityTypeId>[^?/&]+)/(?<discussionOrEntityId>[^?/&]+)",
        "subPathPattern": "/dm/{scope}/{discussionOrEntityTypeId}/{discussionOrEntityId}",
        "summary": "Lists discussion messages in the specified discussion.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "discussionOrEntityTypeId",
            "required": true,
            "type": "RecordTypeId",
            "description": "The <see cref=\"T:AmbientServices.RecordTypeId\" /> of the entity indicated by <paramref name=\"discussionOrEntityId\" />."
          },
          {
            "name": "discussionOrEntityId",
            "required": true,
            "type": "String",
            "description": "A string that is either a <see cref=\"T:AmbientServices.DiscussionId\" /> or another entity ID for which selections can be made."
          },
          {
            "name": "continuation",
            "required": false,
            "type": "String?",
            "description": "An optional continuation string from a previous call to continue listing."
          }
        ],
        "return": {
          "type": "ListDiscussionMessagesResponse",
          "description": "The <see cref=\"T:PicMeApi.ListDiscussionMessagesResponse\" /> containing the response."
        }
      },
      {
        "name": "PatchDiscussion",
        "httpMethod": "PATCH",
        "httpPathRegex": "^/d/i/(?<scope>[^?/&]+)/(?<discussionId>[^?/&]+)",
        "subPathPattern": "/d/i/{scope}/{discussionId}",
        "summary": "Patches a standalone discussion.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "discussionId",
            "required": true,
            "type": "DiscussionId",
            "description": "The <see cref=\"T:AmbientServices.DiscussionId\" /> of the discussion being patched."
          },
          {
            "name": "body",
            "required": true,
            "type": "PatchDiscussionBody",
            "description": "The <see cref=\"T:PicMeApi.PatchDiscussionBody\" /> containing the partial new discussion data."
          }
        ],
        "return": {
          "type": "PatchDiscussionResponse",
          "description": "A <see cref=\"T:PicMeApi.PatchDiscussionResponse\" /> containing the response."
        }
      },
      {
        "name": "GetDiscussion",
        "httpMethod": "GET",
        "httpPathRegex": "^/d/i/(?<scope>[^?/&]+)/(?<discussionId>[^?/&]+)",
        "subPathPattern": "/d/i/{scope}/{discussionId}",
        "summary": "Gets the details for the specified standalone discussion.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "discussionId",
            "required": true,
            "type": "DiscussionId",
            "description": "The <see cref=\"T:AmbientServices.DiscussionId\" /> for the desired discussion."
          }
        ],
        "return": {
          "type": "GetDiscussionResponse",
          "description": "The <see cref=\"T:PicMeApi.GetDiscussionResponse\" /> containing the response."
        }
      },
      {
        "name": "DeleteDiscussion",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/d/i/(?<scope>[^?/&]+)/(?<discussionId>[^?/&]+)",
        "subPathPattern": "/d/i/{scope}/{discussionId}",
        "summary": "Deletes the specified standalone discussion.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "discussionId",
            "required": true,
            "type": "DiscussionId",
            "description": "The <see cref=\"T:AmbientServices.DiscussionId\" /> for the desired discussion."
          }
        ],
        "return": {
          "type": "DeleteDiscussionResponse",
          "description": "A <see cref=\"T:PicMeApi.DeleteDiscussionResponse\" /> containing the response."
        }
      },
      {
        "name": "CreateDiscussion",
        "httpMethod": "POST",
        "httpPathRegex": "^/d/i/(?<scope>[^?/&]+)",
        "subPathPattern": "/d/i/{scope}",
        "summary": "Creates a standalone discussion.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "body",
            "required": true,
            "type": "CreateDiscussionBody",
            "description": "The <see cref=\"T:PicMeApi.CreateDiscussionBody\" /> from the body of the request."
          }
        ],
        "return": {
          "type": "CreateDiscussionResponse",
          "description": "A <see cref=\"T:PicMeApi.CreateDiscussionResponse\" /> containing the response."
        }
      },
      {
        "name": "ListDiscussions",
        "httpMethod": "GET",
        "httpPathRegex": "^/d/i/(?<scope>[^?/&]+)",
        "subPathPattern": "/d/i/{scope}",
        "summary": "Lists standalone discussions that the user has rights to.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "filterQuery",
            "required": false,
            "type": "DiscussionQuery?",
            "description": "An optional <see cref=\"T:PicMeApi.DiscussionQuery\" /> indicating attributes of the discussions 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 discussions will be listed.  If specified, the caller must be a root administrator."
          }
        ],
        "return": {
          "type": "ListDiscussionsResponse",
          "description": "A <see cref=\"T:PicMeApi.ListDiscussionsResponse\" /> containing the response."
        }
      }
    ],
    "types": [
      {
        "name": "DataScope",
        "summary": "A string that contains a data scope which distinguishes one set of data (records or indexes) from another.\n            It can be part or all of one or more record identifiers or paths, or any other unique string, but must not contain embedded NUL characters.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "RecordTypeId",
        "summary": "A struct that holds a record type identifier.\n            Record type identifiers uniquely identify a specific type of record, but take care, as they can be environment-specific (ie. the same type can have different record type identifiers in different environments).",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "DiscussionMessageId",
        "summary": "A struct that holds a discussion message ID.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "PatchDiscussionMessageBody",
        "summary": "A record containing the structure of the body for the <see cref=\"M:PicMeApi.DiscussionApis.PatchDiscussionMessage(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.RecordTypeId,System.String,AmbientServices.DiscussionMessageId,PicMeApi.PatchDiscussionMessageBody)\" /> API.\n            Any parts of the structure may be left unspecified, which will cause the existing value to be retained.",
        "type": "composite",
        "members": [
          {
            "name": "text",
            "type": "Text?",
            "summary": "The <see cref=\"P:PicMeApi.PatchDiscussionMessageBody.Text\" /> of the message."
          }
        ]
      },
      {
        "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": "PatchDiscussionMessageResponse",
        "summary": "The response for <see cref=\"M:PicMeApi.DiscussionApis.PatchDiscussionMessage(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.RecordTypeId,System.String,AmbientServices.DiscussionMessageId,PicMeApi.PatchDiscussionMessageBody)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "message",
            "type": "DiscussionMessage"
          }
        ]
      },
      {
        "name": "DiscussionMessage",
        "summary": "A record that holds information about a discussion message.\n            Discussion messages should be scoped to a discussion or to some other entity (each of which has an implicit discussion).",
        "type": "composite",
        "members": [
          {
            "name": "discussionMessageId",
            "type": "DiscussionMessageId",
            "summary": "The ID of the discussion message."
          },
          {
            "name": "discussionMessageGlobalId",
            "type": "RecordGlobalId",
            "summary": "The Global ID of the discussion message."
          },
          {
            "name": "text",
            "type": "Text",
            "summary": "The text of the discussion message.  Text is assumed to be in Markdown format."
          },
          {
            "name": "creatorUserId",
            "type": "ActorId",
            "summary": "The <see cref=\"T:AmbientServices.ActorId\" /> of the user who created the discussion message."
          },
          {
            "name": "creationTime",
            "type": "DateTime",
            "summary": "The time the discussion message was created."
          },
          {
            "name": "modifierUserId",
            "type": "ActorId",
            "summary": "The <see cref=\"T:AmbientServices.ActorId\" /> of the user who modified the discussion message."
          },
          {
            "name": "modificationTime",
            "type": "DateTime",
            "summary": "The time the discussion message was last modified."
          }
        ]
      },
      {
        "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": "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": "DeleteDiscussionMessageResponse",
        "summary": "A record containing the response after deleting a colleciton.",
        "type": "composite",
        "members": [
          {
            "name": "discussionMessageGlobalId",
            "type": "RecordGlobalId",
            "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the discussion message."
          },
          {
            "name": "discussionMessageId",
            "type": "DiscussionMessageId",
            "summary": "The <see cref=\"P:PicMeApi.DeleteDiscussionMessageResponse.DiscussionMessageId\" /> for the discussion message to be deleted."
          }
        ]
      },
      {
        "name": "CreateDiscussionMessageBody",
        "summary": "A record containing the structure of the body for the <see cref=\"M:PicMeApi.DiscussionApis.CreateDiscussionMessage(AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.RecordTypeId,System.String,PicMeApi.CreateDiscussionMessageBody)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "text",
            "type": "Text",
            "summary": "The <see cref=\"P:PicMeApi.CreateDiscussionMessageBody.Text\" /> of the discussion message."
          }
        ]
      },
      {
        "name": "CreateDiscussionMessageResponse",
        "summary": "The response for <see cref=\"M:PicMeApi.DiscussionApis.CreateDiscussionMessage(AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.RecordTypeId,System.String,PicMeApi.CreateDiscussionMessageBody)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "discussionMessageId",
            "type": "DiscussionMessageId",
            "summary": "The <see cref=\"P:PicMeApi.CreateDiscussionMessageResponse.DiscussionMessageId\" /> for the discussion message."
          }
        ]
      },
      {
        "name": "ListDiscussionMessagesResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.DiscussionApis.ListDiscussionMessages(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.RecordTypeId,System.String,System.String)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "entries",
            "type": "ListedDiscussionMessage[]",
            "summary": "An array of <see cref=\"T:PicMeApi.ListedDiscussionMessage\" /> objects, one for each discussion message."
          },
          {
            "name": "userInfo",
            "type": "UserInfo[]",
            "summary": "An array of <see cref=\"P:PicMeApi.ListDiscussionMessagesResponse.UserInfo\" /> for the users in the discussion."
          },
          {
            "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": "UserInfo",
        "summary": "A record containing basic information about a collaborating user, usually a co-participant in some activity.",
        "type": "composite",
        "members": [
          {
            "name": "userId",
            "type": "UserId",
            "summary": "The <see cref=\"P:AmbientServices.UserInfo.UserId\" /> of this user."
          },
          {
            "name": "unavailable",
            "type": "Boolean",
            "summary": "Whether the user's information is available or not.  If not available, an anonymous placeholder name will be used."
          },
          {
            "name": "name",
            "type": "String",
            "summary": "The user's name."
          },
          {
            "name": "getProfilePicture",
            "type": "Uri?",
            "summary": "A <see cref=\"T:System.Uri\" /> that can be used to retrieve the user's profile picture if one is available, or null if no profile photo is available for this user."
          },
          {
            "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": "ListedDiscussionMessage",
        "summary": "A record containing the data for one discussion message returned in a list of discussion messages.",
        "type": "composite",
        "members": [
          {
            "name": "message",
            "type": "DiscussionMessage",
            "summary": "The <see cref=\"T:AmbientServices.DiscussionMessage\" />."
          }
        ]
      },
      {
        "name": "DiscussionId",
        "summary": "A struct that holds a discussion id.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "PatchDiscussionBody",
        "summary": "A record containing the structure of the body for the <see cref=\"M:PicMeApi.DiscussionApis.PatchDiscussion(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.DiscussionId,PicMeApi.PatchDiscussionBody)\" /> API.\n            Any parts of the structure may be left unspecified, which will cause the existing value to be retained.",
        "type": "composite",
        "members": [
          {
            "name": "topic",
            "type": "Text?",
            "summary": "The topic of the discussion."
          }
        ]
      },
      {
        "name": "PatchDiscussionResponse",
        "summary": "The response for <see cref=\"M:PicMeApi.DiscussionApis.PatchDiscussion(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.DiscussionId,PicMeApi.PatchDiscussionBody)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "discussion",
            "type": "Discussion"
          }
        ]
      },
      {
        "name": "Discussion",
        "summary": "A record that holds information about a discussion.",
        "type": "composite",
        "members": [
          {
            "name": "discussionId",
            "type": "DiscussionId",
            "summary": "The <see cref=\"P:AmbientServices.Discussion.DiscussionId\" /> of the discussion."
          },
          {
            "name": "discussionGlobalId",
            "type": "RecordGlobalId",
            "summary": "The Global ID of the discussion."
          },
          {
            "name": "topic",
            "type": "Text",
            "summary": "A string indicating the topic of the discussion."
          },
          {
            "name": "creatorUserId",
            "type": "ActorId",
            "summary": "The <see cref=\"T:AmbientServices.ActorId\" /> of the user who created the discussion message."
          },
          {
            "name": "creationTime",
            "type": "DateTime",
            "summary": "The time the discussion message was created."
          },
          {
            "name": "modifierUserId",
            "type": "ActorId",
            "summary": "The <see cref=\"T:AmbientServices.ActorId\" /> of the user who modified the discussion message."
          },
          {
            "name": "modificationTime",
            "type": "DateTime",
            "summary": "The time the discussion message was last modified."
          }
        ]
      },
      {
        "name": "GetDiscussionResponse",
        "summary": "A record ctonaining the discussion metadata for the specified discussion.",
        "type": "composite",
        "members": [
          {
            "name": "discussion",
            "type": "Discussion",
            "summary": "The <see cref=\"P:PicMeApi.GetDiscussionResponse.Discussion\" /> data from the _database."
          }
        ]
      },
      {
        "name": "DeleteDiscussionResponse",
        "summary": "A record containing the response after deleting a colleciton.",
        "type": "composite",
        "members": [
          {
            "name": "discussionId",
            "type": "DiscussionId",
            "summary": "The <see cref=\"P:PicMeApi.DeleteDiscussionResponse.DiscussionId\" /> for the discussion to be deleted."
          },
          {
            "name": "discussionGlobalId",
            "type": "RecordGlobalId",
            "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the discussion."
          }
        ]
      },
      {
        "name": "CreateDiscussionBody",
        "summary": "A record containing the structure of the body for the <see cref=\"M:PicMeApi.DiscussionApis.CreateDiscussion(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,PicMeApi.CreateDiscussionBody)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "topic",
            "type": "Text",
            "summary": "The topic of the discussion."
          }
        ]
      },
      {
        "name": "CreateDiscussionResponse",
        "summary": "The response for <see cref=\"M:PicMeApi.DiscussionApis.CreateDiscussion(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,PicMeApi.CreateDiscussionBody)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "discussionId",
            "type": "DiscussionId",
            "summary": "The <see cref=\"P:PicMeApi.CreateDiscussionResponse.DiscussionId\" /> for the new standalone discussion."
          },
          {
            "name": "discussionGlobalId",
            "type": "RecordGlobalId",
            "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the new standalone discussion."
          }
        ]
      },
      {
        "name": "DiscussionQuery",
        "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 discussions were created."
          },
          {
            "name": "creatorUserId",
            "type": "ActorId?",
            "summary": "An optional <see cref=\"T:AmbientServices.ActorId\" /> who is the creator of the desired discussions."
          },
          {
            "name": "modificationTime",
            "type": "DateTimeRange?",
            "summary": "An optional <see cref=\"T:AmbientServices.DateTimeRange\" /> indicating when the desired discussions was modified."
          },
          {
            "name": "topic",
            "type": "String?",
            "summary": "An optional <see cref=\"T:AmbientServices.Text\" /> whose value should match the topic of the discussions."
          },
          {
            "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": "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": "UserId",
        "summary": "A struct that holds a user identifier.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "ListDiscussionsResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.DiscussionApis.ListDiscussions(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,PicMeApi.AuthData,AmbientServices.DataScope,PicMeApi.DiscussionQuery,System.Int32,System.String,System.Nullable{AmbientServices.UserId})\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "discussions",
            "type": "ListedDiscussion[]",
            "summary": "An array of <see cref=\"T:PicMeApi.ListedDiscussion\" /> objects, one for each discussion the user has access to."
          },
          {
            "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": "ListedDiscussion",
        "summary": "A record containing the data for a discussion returned in a list of discussions.",
        "type": "composite",
        "members": [
          {
            "name": "discussion",
            "type": "Discussion",
            "summary": "The <see cref=\"P:PicMeApi.ListedDiscussion.Discussion\" /> contining the discussion data."
          },
          {
            "name": "userRights",
            "type": "CollectionRights",
            "summary": "The <see cref=\"T:AmbientServices.CollectionRights\" /> indicating what rights the user has on the discussion."
          },
          {
            "name": "userParticipationRights",
            "type": "CollectionRights",
            "summary": "The <see cref=\"T:AmbientServices.CollectionRights\" /> indicating what rights the user has on the uploads within the discussion."
          }
        ]
      },
      {
        "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
          }
        ]
      }
    ]
  },
  {
    "endpoint": "InvitationHandler",
    "preferredHttpPath": "/a/i",
    "alternateHttpPaths": [
      "/a/HttpInvitation"
    ],
    "summary": "Invitation-related APIs.",
    "description": "Invitations are standalone objects with a lifetime of their own.\n            When a user activates an invitation, they are given the rights specified by the invitation.\n            They can be limited to a specific time window, or limited in the maximum number of activations.\n            They can be deactivated by the creator at any time.\n            Invitations may be distributed using links through email, text, or any other means, or, more often, using a QR code.",
    "apis": [
      {
        "name": "ActivateInvitation",
        "httpMethod": "POST",
        "httpPathRegex": "^/invitation/(?<inviteId>[^?/&]+)/activate",
        "subPathPattern": "/invitation/{inviteId}/activate",
        "summary": "Activates the specified Invitation.\n            Any authenticated user can activate a Invitation.",
        "description": "On activation,\n            1. the start(s)/end(s) are checked first\n            2. activation attempt is recorded by either user id or activation time, depending on which we are limited on, by activation time if not limited, with the limit being checked afterwards\n            3. link template is expanded and links are created\n            4. the post activation target is navigated to\n            \n            Link activation will enable the following scenarios:\n            1. Link the activator as having been referred by another user (and possibly allow them to create their own full account)\n            2. Add the activator as a \"friend\" of another user\n            3. Add the activator as an upload-only user of a collection\n            4. Add the activator as a guest with specific rights to a collection\n            \n            We may add other properties to the code to perform more complex actions.\n            \n            Exceptions include:\n             o TokenNotYetValidException: The invitation's start date has not arrived yet.\n             o TokenExpiredException: The invitation's end date has passed.\n             o TokenRevokedException: The invitation has been temporarily disabled.\n             o LimitExceededException: The invitation has already been activated the maximum number of times allowed.\n             o RestrictionViolatedException: The invitation is restricted to users with specific contact information, and the activator's contact information is not in the approved list.\n             o BadRequestException: A conflicting link would be created by the activation.",
        "parameters": [
          {
            "name": "inviteId",
            "required": true,
            "type": "InviteCodeId",
            "description": "The <see cref=\"T:AmbientServices.InviteCodeId\" /> for the Invitation being activated."
          },
          {
            "name": "requiredPassword",
            "required": false,
            "type": "String?",
            "description": "The secret required password (if one is required)."
          }
        ],
        "return": {
          "type": "ActivateInvitationResponse",
          "description": "A <see cref=\"T:PicMeApi.ActivateInvitationResponse\" /> containing the post activation target."
        }
      },
      {
        "name": "SimulateInvitationActivation",
        "httpMethod": "POST",
        "httpPathRegex": "^/invitation/(?<inviteId>[^?/&]+)/simulate",
        "subPathPattern": "/invitation/{inviteId}/simulate",
        "summary": "Tests to see if the specified invitation can be activated (without actually activating it) to be sure the specified password works with the specified invitation, ensuring that a subsequent call to <see cref=\"M:PicMeApi.InvitationsApis.ActivateInviteCode(AmbientServices.Database,AmbientServices.Auth,PicMeApi.AuthData,AmbientServices.InviteCodeId,System.String)\" /> will succeed.",
        "parameters": [
          {
            "name": "inviteId",
            "required": true,
            "type": "InviteCodeId",
            "description": "The <see cref=\"T:AmbientServices.InviteCodeId\" /> for the Invitation being activated."
          },
          {
            "name": "requiredPassword",
            "required": false,
            "type": "String?",
            "description": "The secret required password (if one is required)."
          }
        ],
        "return": {
          "type": "ActivateInvitationResponse",
          "description": "A <see cref=\"T:PicMeApi.ActivateInvitationResponse\" /> with the response."
        }
      },
      {
        "name": "ListInvitationActivatedUsers",
        "httpMethod": "GET",
        "httpPathRegex": "^/invitation/(?<inviteId>[^?/&]+)/users",
        "subPathPattern": "/invitation/{inviteId}/users",
        "summary": "Lists all users who have activated the specified Invitation.\n            Note that this includes users who activated the code and then had their rights revoked.\n            Requires ownership of the Invitation.",
        "parameters": [
          {
            "name": "inviteId",
            "required": true,
            "type": "InviteCodeId",
            "description": "The <see cref=\"T:AmbientServices.InviteCodeId\" /> for the collection whose links are wanted."
          }
        ],
        "return": {
          "type": "ActivatedUserData[]",
          "description": "A <see cref=\"T:PicMeApi.ActivatedUserData\" />[] containing the users."
        }
      },
      {
        "name": "ActivateInviteCode",
        "httpMethod": "POST",
        "httpPathRegex": "^/invite/(?<inviteId>[^?/&]+)/activate",
        "subPathPattern": "/invite/{inviteId}/activate",
        "status": "deprecated",
        "notes": "This endpoint is deprecated. Use /invitation instead.",
        "summary": "Activates the specified Invitation.\n            Any authenticated user can activate a Invitation.",
        "description": "On activation,\n            1. the start(s)/end(s) are checked first\n            2. activation attempt is recorded by either user id or activation time, depending on which we are limited on, by activation time if not limited, with the limit being checked afterwards\n            3. link template is expanded and links are created\n            4. the post activation target is navigated to\n            \n            Link activation will enable the following scenarios:\n            1. Link the activator as having been referred by another user (and possibly allow them to create their own full account)\n            2. Add the activator as a \"friend\" of another user\n            3. Add the activator as an upload-only user of a collection\n            4. Add the activator as a guest with specific rights to a collection\n            \n            We may add other properties to the code to perform more complex actions.\n            \n            Exceptions include:\n             o TokenNotYetValidException: The invitation's start date has not arrived yet.\n             o TokenExpiredException: The invitation's end date has passed.\n             o TokenRevokedException: The invitation has been temporarily disabled.\n             o LimitExceededException: The invitation has already been activated the maximum number of times allowed.\n             o RestrictionViolatedException: The invitation is restricted to users with specific contact information, and the activator's contact information is not in the approved list.\n             o BadRequestException: A conflicting link would be created by the activation.",
        "parameters": [
          {
            "name": "inviteId",
            "required": true,
            "type": "InviteCodeId",
            "description": "The <see cref=\"T:AmbientServices.InviteCodeId\" /> for the Invitation being activated."
          },
          {
            "name": "requiredPassword",
            "required": false,
            "type": "String?",
            "description": "The secret required password (if one is required)."
          }
        ],
        "return": {
          "type": "ActivateInviteCodeResponse",
          "description": "A <see cref=\"M:PicMeApi.InvitationsApis.ActivateInviteCode(AmbientServices.Database,AmbientServices.Auth,PicMeApi.AuthData,AmbientServices.InviteCodeId,System.String)\" /> containing the post activation target."
        }
      },
      {
        "name": "SimulateInviteCodeActivation",
        "httpMethod": "POST",
        "httpPathRegex": "^/invite/(?<inviteId>[^?/&]+)/simulate",
        "subPathPattern": "/invite/{inviteId}/simulate",
        "status": "deprecated",
        "notes": "This endpoint is deprecated. Use /invitation instead.",
        "summary": "Tests to see if the specified invitation can be activated (without actually activating it) to be sure the specified password works with the specified invitation, ensuring that a subsequent call to <see cref=\"M:PicMeApi.InvitationsApis.ActivateInviteCode(AmbientServices.Database,AmbientServices.Auth,PicMeApi.AuthData,AmbientServices.InviteCodeId,System.String)\" /> will succeed.",
        "parameters": [
          {
            "name": "inviteId",
            "required": true,
            "type": "InviteCodeId",
            "description": "The <see cref=\"T:AmbientServices.InviteCodeId\" /> for the Invitation being activated."
          },
          {
            "name": "requiredPassword",
            "required": false,
            "type": "String?",
            "description": "The secret required password (if one is required)."
          }
        ],
        "return": {
          "type": "ActivateInviteCodeResponse",
          "description": "A <see cref=\"T:PicMeApi.ActivateInviteCodeResponse\" /> with the response."
        }
      },
      {
        "name": "ListActivatedUsers",
        "httpMethod": "GET",
        "httpPathRegex": "^/invite/(?<inviteId>[^?/&]+)/users",
        "subPathPattern": "/invite/{inviteId}/users",
        "status": "deprecated",
        "notes": "This endpoint is deprecated. Use /invitation instead.",
        "summary": "Lists all users who have activated the specified Invitation.\n            Note that this includes users who activated the code and then had their rights revoked.\n            Requires ownership of the Invitation.",
        "parameters": [
          {
            "name": "inviteId",
            "required": true,
            "type": "InviteCodeId",
            "description": "The <see cref=\"T:AmbientServices.InviteCodeId\" /> for the collection whose links are wanted."
          }
        ],
        "return": {
          "type": "ListInvitationActivatedUsersResponse",
          "description": "A <see cref=\"T:PicMeApi.ListInvitationActivatedUsersResponse\" /> containing the response."
        }
      },
      {
        "name": "GetInvitation",
        "httpMethod": "GET",
        "httpPathRegex": "^/invitation/(?<inviteId>[^?/&]+)",
        "subPathPattern": "/invitation/{inviteId}",
        "summary": "Gets the specified Invitation object.\n            Any authenticated user can call this API, whether they're related to the Invitation or its owner or not.\n            However, for security reasons, the <see cref=\"P:PicMeModel.LinkActivator.RestrictToContacts\" /> field is only populated if the caller is the owner of the Invitation.\n            If the caller is not the owner, however, the <see cref=\"P:PicMeModel.LinkActivator.RestrictToContacts\" /> field is null if there are no restrictions, or an empty array if there are some restrictions.\n            Also, the <see cref=\"P:PicMeModel.LinkActivator.PasswordRequired\" /> field is masked to an empty string if there is a password.  \n            An empty string for the password required property (as opposed to null) indicates to the client that a password is required to activate, but doesn't reveal the password itself.",
        "parameters": [
          {
            "name": "inviteId",
            "required": true,
            "type": "InviteCodeId",
            "description": "The ID of the Invitation to retrieve."
          }
        ],
        "return": {
          "type": "InviteCode",
          "description": "A <see cref=\"T:PicMeModel.InviteCode\" />."
        }
      },
      {
        "name": "PatchInvitation",
        "httpMethod": "PATCH",
        "httpPathRegex": "^/invitation/(?<inviteId>[^?/&]+)",
        "subPathPattern": "/invitation/{inviteId}",
        "summary": "Updates a Invitation object from the specified parameters.\n            Only the Invitation's creator can patch it.",
        "description": "The resulting <see cref=\"P:PicMeModel.InviteCode.LinkActivator\" /> must satisfy the same rules as <see cref=\"M:PicMeApi.InvitationsApis.CreateInvitation(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,PicMeModel.InviteCode,System.Nullable{AmbientServices.RecordGlobalId})\" /> (sharing checks on every template endpoint,\n            participation rights when combined with contact/password restrictions, etc.). Identity and audit fields on the invite are fixed by the server.",
        "parameters": [
          {
            "name": "inviteId",
            "required": true,
            "type": "InviteCodeId",
            "description": "The <see cref=\"T:AmbientServices.InviteCodeId\" /> identifying the Invitation to be updated."
          },
          {
            "name": "body",
            "required": true,
            "type": "InviteCode",
            "partial": true,
            "description": "The <see cref=\"T:AmbientServices.Partial`1\" /> containing a partial <see cref=\"T:PicMeModel.InviteCode\" /> to be applied."
          }
        ],
        "return": {
          "type": "InviteCode",
          "description": "A <see cref=\"T:PicMeModel.InviteCode\" /> containing the updated invitation (including server-assigned fields)."
        }
      },
      {
        "name": "DeleteInvitation",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/invitation/(?<inviteId>[^?/&]+)",
        "subPathPattern": "/invitation/{inviteId}",
        "summary": "Deletes the specified Invitation object.\n            Only the Invitation's creator can delete it.",
        "parameters": [
          {
            "name": "inviteId",
            "required": true,
            "type": "InviteCodeId",
            "description": "The ID of the Invitation to delete."
          }
        ],
        "return": {
          "type": "DeleteInvitationResponse",
          "description": "A <see cref=\"T:PicMeApi.DeleteInvitationResponse\" />."
        }
      },
      {
        "name": "GetInviteCode",
        "httpMethod": "GET",
        "httpPathRegex": "^/invite/(?<inviteId>[^?/&]+)",
        "subPathPattern": "/invite/{inviteId}",
        "status": "deprecated",
        "notes": "This endpoint is deprecated. Use /invitation instead.",
        "summary": "Gets the specified Invitation object.\n            Any authenticated user can call this API, whether they're related to the Invitation or its owner or not.\n            However, for security reasons, the <see cref=\"P:PicMeModel.LinkActivator.RestrictToContacts\" /> field is only populated if the caller is the owner of the Invitation.\n            If the caller is not the owner, however, the <see cref=\"P:PicMeModel.LinkActivator.RestrictToContacts\" /> field is null if there are no restrictions, or an empty array if there are some restrictions.\n            Also, the <see cref=\"P:PicMeModel.LinkActivator.PasswordRequired\" /> field is masked to an empty string if there is a password.  \n            An empty string for the password required property (as opposed to null) indicates to the client that a password is required to activate, but doesn't reveal the password itself.",
        "parameters": [
          {
            "name": "inviteId",
            "required": true,
            "type": "InviteCodeId",
            "description": "The ID of the Invitation to retrieve."
          }
        ],
        "return": {
          "type": "GetInviteCodeResponse",
          "description": "A <see cref=\"T:PicMeApi.GetInviteCodeResponse\" />."
        }
      },
      {
        "name": "PatchInviteCode",
        "httpMethod": "PATCH",
        "httpPathRegex": "^/invite/(?<inviteId>[^?/&]+)",
        "subPathPattern": "/invite/{inviteId}",
        "status": "deprecated",
        "notes": "This endpoint is deprecated. Use /invitation instead.",
        "summary": "Updates a Invitation object from the specified parameters.\n            Only the Invitation's creator can patch it.",
        "parameters": [
          {
            "name": "inviteId",
            "required": true,
            "type": "InviteCodeId",
            "description": "The <see cref=\"T:AmbientServices.InviteCodeId\" /> identifying the Invitation to be updated."
          },
          {
            "name": "body",
            "required": true,
            "type": "PatchInviteCodeBody",
            "description": "The <see cref=\"T:PicMeModel.PatchInviteCodeBody\" /> containing the partial new collection data."
          }
        ],
        "return": {
          "type": "CreateInviteCodeResponse",
          "description": "A <see cref=\"T:PicMeModel.CreateInviteCodeResponse\" /> containing the ID of the new Invitation.  Note that if there is no existing LinkActivator, changes to RestrictToContacts, PasswordRequired, and Relationship will have no effect."
        }
      },
      {
        "name": "DeleteInviteCode",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/invite/(?<inviteId>[^?/&]+)",
        "subPathPattern": "/invite/{inviteId}",
        "status": "deprecated",
        "notes": "This endpoint is deprecated. Use /invitation instead.",
        "summary": "Deletes the specified Invitation object.\n            Only the Invitation's creator can delete it.",
        "parameters": [
          {
            "name": "inviteId",
            "required": true,
            "type": "InviteCodeId",
            "description": "The ID of the Invitation to delete."
          }
        ],
        "return": {
          "type": "DeleteInviteCodeResponse",
          "description": "A <see cref=\"T:PicMeApi.DeleteInviteCodeResponse\" />."
        }
      },
      {
        "name": "CreateInvitation",
        "httpMethod": "POST",
        "httpPathRegex": "^/invitation",
        "subPathPattern": "/invitation",
        "summary": "Creates a Invitation object from the specified parameters.\n            Any authenticated user can create a Invitation, but the Invitation has to link something, and the caller must own whatever is being linked.",
        "description": "Client-supplied <see cref=\"P:PicMeModel.InviteCode.InviteCodeId\" />, <see cref=\"P:PicMeModel.InviteCode.InviteCodeGlobalId\" />, <see cref=\"P:PicMeModel.InviteCode.Created\" />,\n            <see cref=\"P:PicMeModel.InviteCode.CreatorUserId\" />, and <see cref=\"P:PicMeModel.InviteCode.Modified\" /> are ignored; the server assigns these.\n            For each <see cref=\"T:PicMeModel.LinkTemplate\" />, the caller must have sharing rights on every non-empty <see cref=\"P:PicMeModel.LinkTemplate.Primary\" /> or <see cref=\"P:PicMeModel.LinkTemplate.Secondary\" />\n            record (same as <see cref=\"M:PicMeApi.InvitationsApis.CreateInviteCode(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,PicMeApi.CreateInviteCodeBody,System.Nullable{AmbientServices.RecordGlobalId})\" />). When <see cref=\"P:PicMeModel.LinkActivator.RestrictToContacts\" /> or <see cref=\"P:PicMeModel.LinkActivator.PasswordRequired\" /> is set,\n            each participation-rights template has <see cref=\"F:AmbientServices.CollectionRights.ShareWithOthers\" /> stripped from its relationship, matching the single-link behavior of <see cref=\"M:PicMeApi.InvitationsApis.CreateInviteCode(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,PicMeApi.CreateInviteCodeBody,System.Nullable{AmbientServices.RecordGlobalId})\" />.\n            <para><strong>Collections:</strong> use multiple templates when guests need both metadata access and upload moderation.\n            A template with <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> from the activator (empty primary) to the collection grants access on the collection <em>record</em> (e.g. <see cref=\"F:AmbientServices.CollectionRights.Update\" /> to rename).\n            A template with <see cref=\"P:AmbientServices.LinkRelationshipType.ParticipationRights\" /> to the same collection grants guest participation (e.g. <see cref=\"F:AmbientServices.CollectionRights.Update\" /> and <see cref=\"F:AmbientServices.CollectionRights.Delete\" /> to edit or remove others' uploads).\n            </para><para><strong>User quota pooling:</strong> a template <see cref=\"P:AmbientServices.LinkRelationshipType.Hierarchy\" /> from the parent's <see cref=\"T:AmbientServices.RecordGlobalId\" /> (<see cref=\"P:PicMeModel.LinkTemplate.Primary\" />) to an empty <see cref=\"P:PicMeModel.LinkTemplate.Secondary\" />\n            makes the activator a Hierarchy child of that parent user; owned-collection storage and most download bandwidth are billed to the parent's quota billing root.\n            </para>",
        "parameters": [
          {
            "name": "body",
            "required": true,
            "type": "InviteCode",
            "description": "The <see cref=\"T:PicMeModel.InviteCode\" /> from the body of the request."
          },
          {
            "name": "linkParentRecord",
            "required": false,
            "type": "RecordGlobalId?",
            "description": "An optional <see cref=\"T:AmbientServices.RecordGlobalId\" /> to which the created Invitation will be linked as a child (with a <see cref=\"P:AmbientServices.LinkRelationshipType.Hierarchy\" /> link)."
          }
        ],
        "return": {
          "type": "CreateInviteCodeResponse",
          "description": "A <see cref=\"T:PicMeModel.CreateInviteCodeResponse\" /> containing the metadata for the new Invitation."
        }
      },
      {
        "name": "ListInvitations",
        "httpMethod": "GET",
        "httpPathRegex": "^/invitation",
        "subPathPattern": "/invitation",
        "summary": "Lists invitations associated with a specified entity (or owned by the authenticated user or target user if called by a root administrator).\n            The caller must be the owner of the Invitation or must own the contained entity.\n            With a <paramref name=\"linkRelationshipType\" /> of <see cref=\"P:AmbientServices.LinkRelationshipType.Hierarchy\" /> and a <paramref name=\"linkPrimaryGlobalId\" /> for a collection, this will list all the request/sharing invite codes associated with the collection, both request invite codes and sharing invite codes.\n            With a <paramref name=\"linkRelationshipType\" /> of <see cref=\"P:AmbientServices.AuthLinkRelationshipTypes.ReferralLinkType\" /> and a <paramref name=\"linkPrimaryGlobalId\" /> for a user, this will list all the referral invite codes used by the specified user to refer others.",
        "parameters": [
          {
            "name": "linkRelationshipType",
            "required": false,
            "type": "LinkRelationshipType?",
            "description": "An optional <see cref=\"T:AmbientServices.LinkRelationshipType\" /> indicating the type of link the invite codes are expected to be in (as the secondary entity in the link).  If <paramref name=\"linkPrimaryGlobalId\" /> is specified and this parameter is not, it will default to <see cref=\"P:AmbientServices.LinkRelationshipType.Hierarchy\" />."
          },
          {
            "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.  Ignored if <paramref name=\"linkPrimaryGlobalId\" /> is specified."
          },
          {
            "name": "linkPrimaryGlobalId",
            "required": false,
            "type": "RecordGlobalId?",
            "description": "An optional <see cref=\"T:AmbientServices.RecordGlobalId\" /> that links to the desired invite codes as the primary entity in a link of the type specified by <paramref name=\"linkRelationshipType\" />."
          }
        ],
        "return": {
          "type": "InviteCode[]",
          "description": "A <see cref=\"T:PicMeModel.InviteCode\" />[] containing the invitations."
        }
      },
      {
        "name": "GetEntityPhoto",
        "httpMethod": "GET",
        "httpPathRegex": "^/e/photo",
        "subPathPattern": "/e/photo",
        "summary": "Gets information about the photo associated with the specified entity.",
        "parameters": [
          {
            "name": "entityGlobalId",
            "required": true,
            "type": "RecordGlobalId",
            "description": "The global record ID of the entity whose photo info is to be retrieved."
          }
        ],
        "return": {
          "type": "GetEntityPhotoResponse",
          "description": "A <see cref=\"T:PicMeApi.GetEntityPhotoResponse\" /> containing the requested data."
        }
      },
      {
        "name": "PutEntityPhoto",
        "httpMethod": "PUT",
        "httpPathRegex": "^/e/photo",
        "subPathPattern": "/e/photo",
        "summary": "Gets a URL that can be used to update an entity photo.",
        "parameters": [
          {
            "name": "entityGlobalId",
            "required": true,
            "type": "RecordGlobalId",
            "description": "The global record ID of the entity whose photo info is to be updated."
          },
          {
            "name": "fileExtension",
            "required": true,
            "type": "String",
            "description": "The file extension of the photo to be uploaded (if uploading)."
          },
          {
            "name": "contentType",
            "required": true,
            "type": "String",
            "description": "The MIME-type of the photo to be uploaded (if uploading)."
          }
        ],
        "return": {
          "type": "PutEntityPhotoResponse",
          "description": "A <see cref=\"T:PicMeApi.PutEntityPhotoResponse\" /> containing the requested data."
        }
      },
      {
        "name": "DeleteEntityPhoto",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/e/photo",
        "subPathPattern": "/e/photo",
        "summary": "Deletes the cover picture for the specified invitation.",
        "parameters": [
          {
            "name": "entityGlobalId",
            "required": true,
            "type": "RecordGlobalId",
            "description": "The global record ID of the entity whose photo info is to be updated."
          }
        ],
        "return": {
          "type": "DeleteEntityPhotoResponse",
          "description": "A <see cref=\"T:PicMeApi.DeleteEntityPhotoResponse\" /> containing the response."
        }
      },
      {
        "name": "CreateInviteCode",
        "httpMethod": "POST",
        "httpPathRegex": "^/invite",
        "subPathPattern": "/invite",
        "status": "deprecated",
        "notes": "This endpoint is deprecated. Use /invitation instead.",
        "summary": "Creates a Invitation object from the specified parameters.\n            Any authenticated user can create a Invitation, but the Invitation has to link something, and the caller must own whatever is being linked.",
        "parameters": [
          {
            "name": "body",
            "required": true,
            "type": "CreateInviteCodeBody",
            "description": "The <see cref=\"T:PicMeApi.CreateInviteCodeBody\" /> from the body of the request."
          },
          {
            "name": "linkParentRecord",
            "required": false,
            "type": "RecordGlobalId?",
            "description": "An optional <see cref=\"T:AmbientServices.RecordGlobalId\" /> to which the created Invitation will be linked as a child (with a <see cref=\"P:AmbientServices.LinkRelationshipType.Hierarchy\" /> link)."
          }
        ],
        "return": {
          "type": "CreateInviteCodeResponse",
          "description": "A <see cref=\"T:PicMeModel.CreateInviteCodeResponse\" /> containing the metadata for the new Invitation."
        }
      },
      {
        "name": "ListInviteCodes",
        "httpMethod": "GET",
        "httpPathRegex": "^/invite",
        "subPathPattern": "/invite",
        "status": "deprecated",
        "notes": "This endpoint is deprecated. Use /invitation instead.",
        "summary": "Lists invite codes owned by the specified user (or the authenticated user), or associated with a specified entity.\n            The caller must be the owner of the Invitation or must own the contained entity.\n            With a <paramref name=\"linkRelationshipType\" /> of <see cref=\"P:AmbientServices.LinkRelationshipType.Hierarchy\" /> and a <paramref name=\"linkPrimaryGlobalId\" /> for a collection, this will list all the request/sharing invite codes associated with the collection, both request invite codes and sharing invite codes.\n            With a <paramref name=\"linkRelationshipType\" /> of <see cref=\"P:AmbientServices.AuthLinkRelationshipTypes.ReferralLinkType\" /> and a <paramref name=\"linkPrimaryGlobalId\" /> for a user, this will list all the referral invite codes used by the specified user to refer others.",
        "parameters": [
          {
            "name": "linkRelationshipType",
            "required": false,
            "type": "LinkRelationshipType?",
            "description": "An optional <see cref=\"T:AmbientServices.LinkRelationshipType\" /> indicating the type of link the invite codes are expected to be in (as the secondary entity in the link).  If <paramref name=\"linkPrimaryGlobalId\" /> is specified and this parameter is not, it will default to <see cref=\"P:AmbientServices.LinkRelationshipType.Hierarchy\" />."
          },
          {
            "name": "linkPrimaryGlobalId",
            "required": false,
            "type": "RecordGlobalId?",
            "description": "An optional <see cref=\"T:AmbientServices.RecordGlobalId\" /> that links to the desired invite codes as the primary entity in a link of the type specified by <paramref name=\"linkRelationshipType\" />."
          }
        ],
        "return": {
          "type": "ListInviteCodesResponse",
          "description": "A <see cref=\"T:PicMeApi.ListInviteCodesResponse\" /> containing the response."
        }
      }
    ],
    "types": [
      {
        "name": "InviteCodeId",
        "summary": "A struct that holds a Compact Invite Code ID.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "ActivateInvitationResponse",
        "summary": "A record containing the response for <see cref=\"M:PicMeApi.InvitationsApis.ActivateInvitation(AmbientServices.Database,AmbientServices.Auth,PicMeApi.AuthData,AmbientServices.InviteCodeId,System.String)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "clientInformation",
            "type": "String",
            "summary": "A client-controlled string containing any information not otherwise in the invitation that is needed by the client to render a good invite Code landing page and post-activation page."
          }
        ]
      },
      {
        "name": "ActivatedUserData",
        "summary": "A record containing information about a user who has activated an invitation.",
        "type": "composite",
        "members": [
          {
            "name": "userId",
            "type": "UserId",
            "summary": "The <see cref=\"P:PicMeApi.ActivatedUserData.UserId\" /> for the user."
          },
          {
            "name": "name",
            "type": "String",
            "summary": "The name of the user."
          }
        ]
      },
      {
        "name": "ActivateInviteCodeResponse",
        "summary": "A record containing the response for <see cref=\"M:PicMeApi.InvitationsApis.ActivateInviteCode(AmbientServices.Database,AmbientServices.Auth,PicMeApi.AuthData,AmbientServices.InviteCodeId,System.String)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "clientInformation",
            "type": "String",
            "summary": "A client-controlled string containing any information not otherwise in the invitation that is needed by the client to render a good invite Code landing page and post-activation page."
          }
        ]
      },
      {
        "name": "ListInvitationActivatedUsersResponse",
        "summary": "A record containing the response to <see cref=\"M:PicMeApi.InvitationsApis.ListInvitationActivatedUsers(AmbientServices.Database,AmbientServices.Auth,AmbientServices.IFileSystem,PicMeApi.AuthData,AmbientServices.InviteCodeId)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "users",
            "type": "ActivatedUserData[]",
            "summary": "An array of <see cref=\"T:PicMeApi.ActivatedUserData\" /> with basic information about another user who has activated the invitation."
          }
        ]
      },
      {
        "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": "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": "DeleteInvitationResponse",
        "summary": "A record containing the response for <see cref=\"M:PicMeApi.InvitationsApis.DeleteInvitation(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.InviteCodeId)\" />."
      },
      {
        "name": "GetInviteCodeResponse",
        "summary": "A record containing the response for <see cref=\"M:PicMeApi.InvitationsApis.GetInviteCode(AmbientServices.Auth,AmbientServices.Database,AmbientServices.InviteCodeId,PicMeApi.AuthData)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "inviteCode",
            "type": "InviteCode",
            "summary": "A <see cref=\"P:PicMeApi.GetInviteCodeResponse.InviteCode\" /> object containing the invitation data."
          }
        ]
      },
      {
        "name": "PatchInviteCodeBody",
        "summary": "A record containing the body of a request to patch an invite code.",
        "type": "composite",
        "members": [
          {
            "name": "name",
            "type": "String?",
            "summary": "The new name for the invite code (if any)."
          },
          {
            "name": "relationshipType",
            "type": "LinkRelationshipType?",
            "summary": "A <see cref=\"T:AmbientServices.LinkRelationshipType\" /> uniquely identifying the type of link to create when the invite code is activated."
          },
          {
            "name": "relationship",
            "type": "LinkRelationship?",
            "summary": "A <see cref=\"T:AmbientServices.LinkRelationship\" /> representing the type of relationship between the primary and secondary records."
          },
          {
            "name": "limit",
            "type": "Int16?",
            "summary": "An optional limit on the number of users that can use 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": "primaryGlobalId",
            "type": "RecordGlobalId?",
            "summary": "The primary record for the link, or an empty string to be replaced with the activating user's ID."
          },
          {
            "name": "secondaryGlobalId",
            "type": "RecordGlobalId?",
            "summary": "The secondary record for the link, or an empty string to be replaced with the activating user's ID."
          },
          {
            "name": "temporarilyDisabled",
            "type": "Boolean?",
            "summary": "Whether or not the invite code should be temporarily disabled."
          },
          {
            "name": "start",
            "type": "DateTime?",
            "summary": "An optional time to enable the invite code."
          },
          {
            "name": "end",
            "type": "DateTime?",
            "summary": "An optional time to disable the invite code."
          },
          {
            "name": "conflictResolution",
            "type": "LinkConflictResolution?",
            "summary": "A <see cref=\"T:PicMeModel.LinkConflictResolution\" /> indicating how conflicts should be detected and handled."
          },
          {
            "name": "message",
            "type": "String?",
            "summary": "A string containing a message to display to recipients of the invitation."
          },
          {
            "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, which will be required from the activator to activate the invitation.  Null or unspecified if not used.  Must not be empty string because that has a special meaning on retrieval."
          }
        ]
      },
      {
        "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": "DeleteInviteCodeResponse",
        "summary": "A record containing the response for <see cref=\"M:PicMeApi.InvitationsApis.DeleteInviteCode(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.InviteCodeId)\" />."
      },
      {
        "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": "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": "UserId",
        "summary": "A struct that holds a user identifier.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "GetEntityPhotoResponse",
        "summary": "A record containing the response for <see cref=\"M:PicMeApi.InvitationsApis.GetEntityPhoto(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,AmbientServices.RecordGlobalId)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "version",
            "type": "String",
            "summary": "A string indicating the version of the photo."
          },
          {
            "name": "getProfilePictureLocation",
            "type": "String",
            "summary": "A string containing a URL that may temporariliy be used to GET the entity photo."
          }
        ]
      },
      {
        "name": "PutEntityPhotoResponse",
        "summary": "A record containing the response for <see cref=\"M:PicMeApi.InvitationsApis.GetEntityPhoto(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,AmbientServices.RecordGlobalId)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "version",
            "type": "String",
            "summary": "A string indicating the version of the photo."
          },
          {
            "name": "putProfilePictureLocation",
            "type": "String",
            "summary": "A string containing a URL that may temporariliy be used to PUT the entity photo."
          }
        ]
      },
      {
        "name": "DeleteEntityPhotoResponse",
        "summary": "A record containing the response for <see cref=\"M:PicMeApi.InvitationsApis.GetEntityPhoto(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,AmbientServices.AutoRotatingEncryptionKeyManager,AmbientServices.RecordGlobalId)\" />."
      },
      {
        "name": "CreateInviteCodeBody",
        "summary": "A record containing the body of a request to create an invitation.",
        "type": "composite",
        "members": [
          {
            "name": "name",
            "type": "String",
            "summary": "The name for the invitation."
          },
          {
            "name": "relationshipType",
            "type": "LinkRelationshipType",
            "summary": "A <see cref=\"T:AmbientServices.LinkRelationshipType\" /> uniquely identifying the type of link to create when the invitation is activated."
          },
          {
            "name": "relationship",
            "type": "LinkRelationship",
            "summary": "A <see cref=\"T:AmbientServices.LinkRelationship\" /> representing the type of relationship between the primary and secondary records."
          },
          {
            "name": "limit",
            "type": "Int16",
            "summary": "An optional limit on the number of users that can use the invitation."
          },
          {
            "name": "clientInformation",
            "type": "String",
            "summary": "A client-controlled string containing any information not otherwise in the invitation that is needed by the client to render a good invitation landing page and post-activation page."
          },
          {
            "name": "primaryGlobalId",
            "type": "RecordGlobalId",
            "summary": "The primary record for the link, or an empty string to be replaced with the activating user's ID."
          },
          {
            "name": "secondaryGlobalId",
            "type": "RecordGlobalId",
            "summary": "The secondary record for the link, or an empty string to be replaced with the activating user's ID."
          },
          {
            "name": "temporarilyDisabled",
            "type": "Boolean",
            "summary": "Whether or not the invitation should be temporarily disabled."
          },
          {
            "name": "start",
            "type": "DateTime?",
            "summary": "An optional time to enable the invitation."
          },
          {
            "name": "end",
            "type": "DateTime?",
            "summary": "An optional time to disable the invitation."
          },
          {
            "name": "conflictResolution",
            "type": "LinkConflictResolution",
            "summary": "A <see cref=\"T:PicMeModel.LinkConflictResolution\" /> indicating how conflicts should be detected and handled."
          },
          {
            "name": "message",
            "type": "String?",
            "summary": "A string containing a message to display to recipients of the invitation."
          },
          {
            "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, which will be required from the activator to activate the invitation.  Null or unspecified if not used.  Must not be empty string because that has a special meaning on retrieval."
          }
        ]
      },
      {
        "name": "ListInviteCodesResponse",
        "summary": "A list of <see cref=\"T:PicMeModel.InviteCode\" /> in response to <see cref=\"M:PicMeApi.InvitationsApis.ListInviteCodes(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,System.Nullable{AmbientServices.LinkRelationshipType},System.Nullable{AmbientServices.RecordGlobalId})\" />.",
        "type": "composite",
        "members": [
          {
            "name": "inviteCodes",
            "type": "InviteCode[]",
            "summary": "An arry of <see cref=\"T:PicMeModel.InviteCode\" /> records."
          }
        ]
      }
    ]
  },
  {
    "endpoint": "NotificationHandler",
    "preferredHttpPath": "/a/n",
    "alternateHttpPaths": [
      "/a/HttpNotification"
    ],
    "summary": "Notification-related APIs.",
    "description": "Users can subscribe to notifications of various types using this endpoint.\n            Email notifications can happen immediately, in a daily digest, or in a weekly digest.\n            Links in emails contain URLS that can be used to modify email subscriptions without logging in.\n            In-app notifications are also supported and the information needed to hook those up is also configured and provided by this endpoint.",
    "apis": [
      {
        "name": "Unsubscribe",
        "httpMethod": "GET",
        "httpPathRegex": "^/unsubscribe/(?<signature>[^?/&]+)",
        "subPathPattern": "/unsubscribe/{signature}",
        "summary": "Unsubscribes the specified user from email notifications.",
        "parameters": [
          {
            "name": "signature",
            "required": true,
            "type": "SignedSecurityToken",
            "description": "The <see cref=\"T:AmbientServices.SignedSecurityToken\" /> to be sure the link used by caller was generated by PicMe."
          }
        ],
        "return": {
          "type": "UnsubscribeResponse",
          "description": "A <see cref=\"T:PicMeApi.UnsubscribeResponse\" /> containing the response."
        }
      },
      {
        "name": "TrackOpen",
        "httpMethod": "GET",
        "httpPathRegex": "^/ni/(?<signature>[^?/&]+)",
        "subPathPattern": "/ni/{signature}",
        "summary": "Tracks a user opening an email notification.",
        "parameters": [
          {
            "name": "signature",
            "required": true,
            "type": "SignedSecurityToken",
            "description": "The <see cref=\"T:AmbientServices.SignedSecurityToken\" /> to be sure the link used by caller was generated by PicMe."
          }
        ],
        "return": {
          "type": "BufferedRawLambdaResponse",
          "description": "A <see cref=\"T:AmbientServices.BufferedRawLambdaResponse\" /> containing the response."
        }
      },
      {
        "name": "UpdateFirebaseCloudMessagingProjectConfig",
        "httpMethod": "PUT",
        "httpPathRegex": "^/config/firebase-project",
        "subPathPattern": "/config/firebase-project",
        "summary": "Updates the Firebase Cloud Messaging project configuration.",
        "parameters": [
          {
            "name": "config",
            "required": true,
            "type": "FirebaseCloudMessagingProjectConfig",
            "description": "The <see cref=\"T:AmbientServices.FirebaseCloudMessagingProjectConfig\" /> to store."
          }
        ],
        "return": {
          "type": "UpdateFirebaseCloudMessagingProjectConfigResponse",
          "description": "A <see cref=\"T:PicMeApi.UpdateFirebaseCloudMessagingProjectConfigResponse\" /> containing the response"
        }
      },
      {
        "name": "GetFirebaseCloudMessagingProjectConfig",
        "httpMethod": "GET",
        "httpPathRegex": "^/config/firebase-project",
        "subPathPattern": "/config/firebase-project",
        "summary": "Gets the Firebase Cloud Messaging projecct configuration needed by the client.",
        "parameters": [],
        "return": {
          "type": "GetFirebaseCloudMessagingProjectConfigResponse",
          "description": "A <see cref=\"T:PicMeApi.GetFirebaseCloudMessagingProjectConfigResponse\" /> containing the response"
        }
      },
      {
        "name": "SendTestPushNotification",
        "httpMethod": "POST",
        "httpPathRegex": "^/test-push-notification",
        "subPathPattern": "/test-push-notification",
        "summary": "Sends a test push notification to all the authenticated user's registered devices.",
        "parameters": [
          {
            "name": "collectionId",
            "required": true,
            "type": "CollectionId",
            "description": "The <see cref=\"T:PicMeModel.CollectionId\" /> to use for the notification message."
          },
          {
            "name": "collectionCommentCount",
            "required": false,
            "type": "Int32",
            "description": "The number of comments on the collection."
          },
          {
            "name": "uploadId",
            "required": false,
            "type": "UploadId?",
            "description": "The <see cref=\"T:PicMeModel.UploadId\" /> for the upload (if an upload notification is desired)."
          },
          {
            "name": "uploadCommentCount",
            "required": false,
            "type": "Int32",
            "description": "The number of comments on the specified upload."
          },
          {
            "name": "uploadReactionCount",
            "required": false,
            "type": "Int32",
            "description": "The number of reactions on the specified upload."
          }
        ],
        "return": {
          "type": "SendTestNotificationResponse",
          "description": "A <see cref=\"T:PicMeApi.SendTestNotificationResponse\" /> containing the response"
        }
      },
      {
        "name": "PutPushNotificationSubscriptionConfigurations",
        "httpMethod": "PUT",
        "httpPathRegex": "^/push-notification",
        "subPathPattern": "/push-notification",
        "summary": "Sets one or more push notification subscription configurations.",
        "parameters": [
          {
            "name": "subscriptions",
            "required": true,
            "type": "PushNotificationSubscription[]",
            "description": "An array of <see cref=\"T:PicMeModel.PushNotificationSubscription\" /> to set."
          }
        ],
        "return": {
          "type": "PutPushNotificationSubscriptionConfigurationsResponse",
          "description": "A <see cref=\"T:PicMeApi.PutPushNotificationSubscriptionConfigurationsResponse\" /> containing the response."
        }
      },
      {
        "name": "ListPushNotificationSubscriptionConfigurations",
        "httpMethod": "GET",
        "httpPathRegex": "^/push-notification",
        "subPathPattern": "/push-notification",
        "summary": "Lists the user's push notification subscription configurations.",
        "parameters": [],
        "return": {
          "type": "ListPushNotificationSubscriptionConfigurationsResponse",
          "description": "A <see cref=\"T:PicMeApi.ListPushNotificationSubscriptionConfigurationsResponse\" /> containing the response."
        }
      },
      {
        "name": "GetUserNotificationSummaryByRange",
        "httpMethod": "GET",
        "httpPathRegex": "^/summary-range",
        "subPathPattern": "/summary-range",
        "summary": "Gets a summary of the ambient user's notification events for the specified time range.",
        "parameters": [
          {
            "name": "startTime",
            "required": true,
            "type": "DateTime",
            "description": "The minimum <see cref=\"T:System.DateTime\" /> whose notification events are to be retrieved."
          },
          {
            "name": "endTime",
            "required": true,
            "type": "DateTime",
            "description": "The maximum <see cref=\"T:System.DateTime\" /> whose notification events are to be retrieved."
          },
          {
            "name": "collectionId",
            "required": false,
            "type": "CollectionId?",
            "description": "An optional <see cref=\"T:PicMeModel.CollectionId\" /> to restrict the listed notifications to the specified collection."
          }
        ],
        "return": {
          "type": "GetUserNotificationSummaryResponse",
          "description": "A <see cref=\"T:PicMeApi.GetUserNotificationSummaryResponse\" /> containing the response"
        }
      },
      {
        "name": "MarkNotificationSummaryRead",
        "httpMethod": "PUT",
        "httpPathRegex": "^/summary/read",
        "subPathPattern": "/summary/read",
        "summary": "Marks the specified notification event as read.",
        "parameters": [
          {
            "name": "date",
            "required": true,
            "type": "DateOnly",
            "description": "The <see cref=\"T:System.DateOnly\" /> whose notification events are to be retrieved."
          },
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the event, often a collecction scope."
          },
          {
            "name": "targetEntityTypeId",
            "required": true,
            "type": "RecordTypeId",
            "description": "The <see cref=\"T:AmbientServices.RecordTypeId\" /> for the target entity."
          },
          {
            "name": "targetEntityId",
            "required": true,
            "type": "String",
            "description": "The ID of the event entity."
          },
          {
            "name": "eventType",
            "required": true,
            "type": "NotificationDigestEventType",
            "description": "The <see cref=\"T:PicMeModel.NotificationDigestEventType\" /> indication what type of event happened."
          }
        ],
        "return": {
          "type": "MarkNotificationSummaryReadResponse",
          "description": "A <see cref=\"T:PicMeApi.MarkNotificationSummaryReadResponse\" /> containing the response"
        }
      },
      {
        "name": "RegisterFirebaseDevice",
        "httpMethod": "PUT",
        "httpPathRegex": "^/fbd/register",
        "subPathPattern": "/fbd/register",
        "summary": "Registers a firebase device for the currently-authenticated user.\n            See <see cref=\"M:PicMeApi.NotificationApis.DeregisterFirebaseDevice(AmbientServices.Auth,PicMeApi.AuthData,System.String)\" /> for deregistration.",
        "parameters": [
          {
            "name": "firebaseDeviceId",
            "required": true,
            "type": "String",
            "description": "A string containing the firebase device ID to be attached to the authenticated user's account."
          }
        ],
        "return": {
          "type": "RegisterFirebaseDeviceResponse",
          "description": "A <see cref=\"T:PicMeApi.RegisterFirebaseDeviceResponse\" /> containing the response."
        }
      },
      {
        "name": "DeregisterFirebaseDevice",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/fbd/register",
        "subPathPattern": "/fbd/register",
        "summary": "Deregisters a firebase device for the currently-authenticated user.\n            The device should have been previously registered using <see cref=\"M:PicMeApi.NotificationApis.RegisterFirebaseDevice(AmbientServices.Auth,PicMeApi.AuthData,System.String)\" />, but if it hasn't no error is returned, as this function is idempotent.",
        "parameters": [
          {
            "name": "firebaseDeviceId",
            "required": true,
            "type": "String",
            "description": "A string containing the firebase device ID to be attached to the authenticated user's account."
          }
        ],
        "return": {
          "type": "DeregisterFirebaseDeviceResponse",
          "description": "A <see cref=\"T:PicMeApi.DeregisterFirebaseDeviceResponse\" /> containing the response."
        }
      },
      {
        "name": "ListRegisteredFirebaseDevices",
        "httpMethod": "GET",
        "httpPathRegex": "^/fbd/register",
        "subPathPattern": "/fbd/register",
        "summary": "Lists the users registered firebase devices.\n            The devices have been previously registered using <see cref=\"M:PicMeApi.NotificationApis.RegisterFirebaseDevice(AmbientServices.Auth,PicMeApi.AuthData,System.String)\" />, but haven't been\n            deregistered using <see cref=\"M:PicMeApi.NotificationApis.DeregisterFirebaseDevice(AmbientServices.Auth,PicMeApi.AuthData,System.String)\" />.",
        "parameters": [],
        "return": {
          "type": "ListRegisteredFirebaseDevicesResponse",
          "description": "A <see cref=\"T:PicMeApi.ListRegisteredFirebaseDevicesResponse\" /> containing the response."
        }
      },
      {
        "name": "PutNotificationSubscriptionConfigurations",
        "httpMethod": "PUT",
        "httpPathRegex": "^/notification",
        "subPathPattern": "/notification",
        "summary": "Sets one or more notification subscription configurations.",
        "parameters": [
          {
            "name": "subscriptions",
            "required": true,
            "type": "NotificationSubscription[]",
            "description": "An array of <see cref=\"T:PicMeModel.NotificationSubscription\" /> to set."
          }
        ],
        "return": {
          "type": "PutNotificationSubscriptionConfigurationsResponse",
          "description": "A <see cref=\"T:PicMeApi.PutNotificationSubscriptionConfigurationsResponse\" /> containing the response."
        }
      },
      {
        "name": "ListNotificationSubscriptionConfigurations",
        "httpMethod": "GET",
        "httpPathRegex": "^/notification",
        "subPathPattern": "/notification",
        "summary": "Lists the user's notification subscription configurations.",
        "parameters": [],
        "return": {
          "type": "ListNotificationSubscriptionConfigurationsResponse",
          "description": "A <see cref=\"T:PicMeApi.ListNotificationSubscriptionConfigurationsResponse\" /> containing the response."
        }
      },
      {
        "name": "GetUserNotificationEventsByRange",
        "httpMethod": "GET",
        "httpPathRegex": "^/event-range",
        "subPathPattern": "/event-range",
        "summary": "Gets the ambient user's notification events for the specified time range.",
        "parameters": [
          {
            "name": "startTime",
            "required": true,
            "type": "DateTime",
            "description": "The minimum <see cref=\"T:System.DateTime\" /> whose notification events are to be retrieved."
          },
          {
            "name": "endTime",
            "required": true,
            "type": "DateTime",
            "description": "The maximum <see cref=\"T:System.DateTime\" /> whose notification events are to be retrieved."
          },
          {
            "name": "collectionId",
            "required": false,
            "type": "CollectionId?",
            "description": "An optional <see cref=\"T:PicMeModel.CollectionId\" /> to restrict the listed notifications to the specified collection."
          }
        ],
        "return": {
          "type": "GetUserNotificationEventsResponse",
          "description": "A <see cref=\"T:PicMeApi.GetUserNotificationEventsResponse\" /> containing the response"
        }
      },
      {
        "name": "MarkNotificationEventRead",
        "httpMethod": "PUT",
        "httpPathRegex": "^/event/read",
        "subPathPattern": "/event/read",
        "summary": "Marks the specified notification event as read.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the event, often a collecction scope."
          },
          {
            "name": "targetEntityTypeId",
            "required": true,
            "type": "RecordTypeId",
            "description": "The <see cref=\"T:AmbientServices.RecordTypeId\" /> for the target entity."
          },
          {
            "name": "targetEntityId",
            "required": true,
            "type": "String",
            "description": "The ID of the event entity."
          },
          {
            "name": "eventType",
            "required": true,
            "type": "NotificationDigestEventType",
            "description": "The <see cref=\"T:PicMeModel.NotificationDigestEventType\" /> indication what type of event happened."
          },
          {
            "name": "eventTime",
            "required": true,
            "type": "DateTime",
            "description": "The <see cref=\"T:System.DateTime\" /> when the event happened."
          },
          {
            "name": "actorId",
            "required": true,
            "type": "String",
            "description": "The ID of the entity responsible for causing the event (usually the user that did something)."
          },
          {
            "name": "parameters",
            "required": true,
            "type": "String[]?",
            "description": "The array of parameters for the notification (may be null, but must be specified)."
          }
        ],
        "return": {
          "type": "MarkNotificationEventReadResponse",
          "description": "A <see cref=\"T:PicMeApi.MarkNotificationEventReadResponse\" /> containing the response"
        }
      },
      {
        "name": "GetUserNotificationSummary",
        "httpMethod": "GET",
        "httpPathRegex": "^/summary",
        "subPathPattern": "/summary",
        "summary": "Gets a summary of the ambient user's notification events for the specified date.",
        "parameters": [
          {
            "name": "date",
            "required": true,
            "type": "DateOnly",
            "description": "The <see cref=\"T:System.DateOnly\" /> whose notification events are to be retrieved."
          },
          {
            "name": "collectionId",
            "required": false,
            "type": "CollectionId?",
            "description": "An optional <see cref=\"T:PicMeModel.CollectionId\" /> to restrict the listed notifications to the specified collection."
          }
        ],
        "return": {
          "type": "GetUserNotificationSummaryResponse",
          "description": "A <see cref=\"T:PicMeApi.GetUserNotificationSummaryResponse\" /> containing the response"
        }
      },
      {
        "name": "GetUserNotificationEvents",
        "httpMethod": "GET",
        "httpPathRegex": "^/event",
        "subPathPattern": "/event",
        "summary": "Gets the ambient user's notification events for the specified date.",
        "parameters": [
          {
            "name": "date",
            "required": true,
            "type": "DateOnly",
            "description": "The <see cref=\"T:System.DateOnly\" /> whose notification events are to be retrieved."
          },
          {
            "name": "collectionId",
            "required": false,
            "type": "CollectionId?",
            "description": "An optional <see cref=\"T:PicMeModel.CollectionId\" /> to restrict the listed notifications to the specified collection."
          }
        ],
        "return": {
          "type": "GetUserNotificationEventsResponse",
          "description": "A <see cref=\"T:PicMeApi.GetUserNotificationEventsResponse\" /> containing the response"
        }
      }
    ],
    "types": [
      {
        "name": "SignedSecurityToken",
        "summary": "A struct that holds a PicMe collection sharing authorization code.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "UnsubscribeResponse",
        "summary": "A record containing the response of a request to unsubscribe.",
        "type": "composite",
        "members": [
          {
            "name": "collectionsUnsubscribed",
            "type": "Int32"
          }
        ]
      },
      {
        "name": "BufferedRawLambdaResponse",
        "summary": "A special API response type for returning raw data such as binary image data.",
        "type": "proxy",
        "representedBy": "Byte[]"
      },
      {
        "name": "FirebaseCloudMessagingProjectConfig",
        "summary": "The Firebase cloud messaging configuration.",
        "type": "composite",
        "members": [
          {
            "name": "type",
            "type": "String",
            "summary": "The type of credential."
          },
          {
            "name": "projectId",
            "type": "String",
            "summary": "The project ID allocated by Firebase."
          },
          {
            "name": "privateKeyId",
            "type": "String",
            "summary": "The ID of the private Key."
          },
          {
            "name": "privateKey",
            "type": "String",
            "summary": "The actual private key."
          },
          {
            "name": "clientEmail",
            "type": "String",
            "summary": "The client email."
          },
          {
            "name": "clientId",
            "type": "String",
            "summary": "The client ID."
          },
          {
            "name": "authUri",
            "type": "String",
            "summary": "The auth URI."
          },
          {
            "name": "tokenUri",
            "type": "String",
            "summary": "The token URI."
          },
          {
            "name": "authProviderX509CertUrl",
            "type": "String",
            "summary": "The provider's certificate URL."
          },
          {
            "name": "clientX509CertUrl",
            "type": "String",
            "summary": "The client's certificate URL."
          }
        ]
      },
      {
        "name": "UpdateFirebaseCloudMessagingProjectConfigResponse",
        "summary": "A record containing the response to a request to set the Firebase Cloud Messaging project configuration."
      },
      {
        "name": "GetFirebaseCloudMessagingProjectConfigResponse",
        "summary": "A record containing the response to a request to get the Firebase Cloud Messaging project configuration.",
        "type": "composite",
        "members": [
          {
            "name": "firebaseProjectId",
            "type": "String",
            "summary": "The Firebase Cloud Messaging project ID."
          }
        ]
      },
      {
        "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": "SendTestNotificationResponse",
        "summary": "A record containing the response to a request to send a test notification.",
        "type": "composite",
        "members": [
          {
            "name": "deviceNotificationsSent",
            "type": "Int32",
            "summary": "The number of device notifications sent."
          }
        ]
      },
      {
        "name": "PushNotificationSubscription",
        "summary": "A record that contains information about desired push notification types.\n            Multiple such records may exist, one as a default for each user, and others with overrides for each collection.\n            If such a record doesn't exist, the default will be <see cref=\"F:PicMeModel.NotificationType.Uploads\" />.",
        "type": "composite",
        "members": [
          {
            "name": "collectionId",
            "type": "CollectionId?",
            "summary": "The <see cref=\"P:PicMeModel.PushNotificationSubscription.CollectionId\" /> of the collection the settings belong to, or null if they're the default selections."
          },
          {
            "name": "types",
            "type": "NotificationType?",
            "summary": "An optional set of <see cref=\"T:PicMeModel.NotificationType\" /> indicating which type(s) of notifications are desired."
          }
        ]
      },
      {
        "name": "NotificationType",
        "summary": "An enumeration of types of notifications.",
        "type": "enum",
        "flags": true,
        "enumValues": [
          {
            "name": "None",
            "summary": "The user does not want to receive notifications for any change types.",
            "value": 0
          },
          {
            "name": "Uploads",
            "summary": "Notifications that new items have been uploaded.",
            "value": 2
          },
          {
            "name": "Comments",
            "summary": "Notifications about new comments.",
            "value": 16
          },
          {
            "name": "Votes",
            "summary": "Notifications about new votes (poll activity/reactions/likes).",
            "value": 32
          }
        ]
      },
      {
        "name": "PutPushNotificationSubscriptionConfigurationsResponse",
        "summary": "A record containing the response of a request to put the push notification subscription configurations."
      },
      {
        "name": "ListPushNotificationSubscriptionConfigurationsResponse",
        "summary": "A record containing push notification subscription configurations.",
        "type": "composite",
        "members": [
          {
            "name": "subscriptions",
            "type": "PushNotificationSubscription[]",
            "summary": "The <see cref=\"T:PicMeModel.PushNotificationSubscription\" />s for the user."
          }
        ]
      },
      {
        "name": "GetUserNotificationSummaryResponse",
        "summary": "A record containing the response to a request to get the user's notification events.",
        "type": "composite",
        "members": [
          {
            "name": "events",
            "type": "UserNotificationSummary[]",
            "summary": "An array of <see cref=\"T:PicMeApi.UserNotificationSummary\" />s summarizing the user's notification events."
          },
          {
            "name": "actors",
            "type": "UserInfo[]",
            "summary": "An array of <see cref=\"T:AmbientServices.UserInfo\" />s for the actors that caused the events."
          }
        ]
      },
      {
        "name": "UserInfo",
        "summary": "A record containing basic information about a collaborating user, usually a co-participant in some activity.",
        "type": "composite",
        "members": [
          {
            "name": "userId",
            "type": "UserId",
            "summary": "The <see cref=\"P:AmbientServices.UserInfo.UserId\" /> of this user."
          },
          {
            "name": "unavailable",
            "type": "Boolean",
            "summary": "Whether the user's information is available or not.  If not available, an anonymous placeholder name will be used."
          },
          {
            "name": "name",
            "type": "String",
            "summary": "The user's name."
          },
          {
            "name": "getProfilePicture",
            "type": "Uri?",
            "summary": "A <see cref=\"T:System.Uri\" /> that can be used to retrieve the user's profile picture if one is available, or null if no profile photo is available for this user."
          },
          {
            "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": "UserId",
        "summary": "A struct that holds a user identifier.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "UserNotificationSummary",
        "summary": "A record containing information about a notification event for a specific user.",
        "type": "composite",
        "members": [
          {
            "name": "recipientEntityId",
            "type": "String",
            "summary": "The ID of the recipient entity (usually a user)."
          },
          {
            "name": "targetEntity",
            "type": "EntityInfo",
            "summary": "A <see cref=\"T:PicMeApi.EntityInfo\" /> for the target entity."
          },
          {
            "name": "eventType",
            "type": "NotificationDigestEventType",
            "summary": "The <see cref=\"T:PicMeModel.NotificationDigestEventType\" /> indication what type of event happened."
          },
          {
            "name": "actors",
            "type": "UserId[]",
            "summary": "An array of <see cref=\"T:AmbientServices.UserId\" />s for the actors that caused the events."
          },
          {
            "name": "firstEventTime",
            "type": "DateTime",
            "summary": "The <see cref=\"T:System.DateTime\" /> when the first event happened."
          },
          {
            "name": "lastEventTime",
            "type": "DateTime",
            "summary": "The <see cref=\"T:System.DateTime\" /> when the last event happened (will be the same as <paramref name=\"FirstEventTime\" /> if there is only one event."
          },
          {
            "name": "read",
            "type": "Boolean",
            "summary": "Whether or not this notification has been read."
          }
        ]
      },
      {
        "name": "EntityInfo",
        "summary": "User-readble information about an entity.",
        "type": "composite",
        "members": [
          {
            "name": "scope",
            "type": "DataScope",
            "summary": "The <see cref=\"T:AmbientServices.DataScope\" /> for the event, often a collection scope."
          },
          {
            "name": "entityTypeId",
            "type": "RecordTypeId",
            "summary": "The <see cref=\"T:AmbientServices.RecordTypeId\" /> for the target entity."
          },
          {
            "name": "entityId",
            "type": "String",
            "summary": "The ID of the event entity."
          },
          {
            "name": "parentTitle",
            "type": "String?",
            "summary": "The parent title, if there is a parent."
          },
          {
            "name": "title",
            "type": "String",
            "summary": "The name assigned to the entity."
          }
        ]
      },
      {
        "name": "DataScope",
        "summary": "A string that contains a data scope which distinguishes one set of data (records or indexes) from another.\n            It can be part or all of one or more record identifiers or paths, or any other unique string, but must not contain embedded NUL characters.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "RecordTypeId",
        "summary": "A struct that holds a record type identifier.\n            Record type identifiers uniquely identify a specific type of record, but take care, as they can be environment-specific (ie. the same type can have different record type identifiers in different environments).",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "NotificationDigestEventType",
        "summary": "An enumeration of notification digest actions.",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "Upload",
            "summary": "An item was uploaded to a collection.  The target entity ID is an upload ID with a scope that is a collection.",
            "value": 0
          },
          {
            "name": "Message",
            "summary": "A discussion message was added.  The target entity ID is a discussion message id with a scope that is either a collection or an upload.",
            "value": 1
          },
          {
            "name": "Vote",
            "summary": "Someone voted in a poll.  The target entity ID is either an upload with a scope that is a collection, or a collection with global scope.",
            "value": 2
          }
        ]
      },
      {
        "name": "MarkNotificationSummaryReadResponse",
        "summary": "A record containing the response to a request to mark a notification summary as read."
      },
      {
        "name": "RegisterFirebaseDeviceResponse",
        "summary": "A record containing the response to a request to register a firebase device.",
        "type": "composite",
        "members": [
          {
            "name": "previouslyRegistered",
            "type": "Boolean",
            "summary": "Whether the device was previously registered."
          }
        ]
      },
      {
        "name": "DeregisterFirebaseDeviceResponse",
        "summary": "A record containing the response to a request to deregister a firebase device."
      },
      {
        "name": "ListRegisteredFirebaseDevicesResponse",
        "summary": "A record containing the response from a request to list the firebase devices.",
        "type": "composite",
        "members": [
          {
            "name": "firebaseDeviceIds",
            "type": "String[]",
            "summary": "An array containing the registered firebase device IDs."
          }
        ]
      },
      {
        "name": "NotificationSubscription",
        "summary": "A record that contains information about desired notification types, channels, and frequency.\n            Multiple such records may exist, one as a default for each user, and others with overrides for each collection.\n            If such a record doesn't exist, the default will be <see cref=\"F:PicMeModel.NotificationType.Uploads\" />, <see cref=\"F:PicMeModel.NotificationChannel.Email\" />, <see cref=\"F:PicMeModel.NotificationFrequency.Daily\" />.",
        "type": "composite",
        "members": [
          {
            "name": "collectionId",
            "type": "CollectionId?",
            "summary": "The <see cref=\"P:PicMeModel.NotificationSubscription.CollectionId\" /> of the collection the settings belong to, or null if they're the default selections."
          },
          {
            "name": "types",
            "type": "NotificationType?",
            "summary": "An optional set of <see cref=\"T:PicMeModel.NotificationType\" /> indicating which type(s) of notifications are desired."
          },
          {
            "name": "channels",
            "type": "NotificationChannel?",
            "summary": "An optional set of <see cref=\"T:PicMeModel.NotificationChannel\" /> indicating which channels the notifications should be sent through."
          },
          {
            "name": "frequency",
            "type": "NotificationFrequency?",
            "summary": "An optional set of <see cref=\"T:PicMeModel.NotificationFrequency\" /> indicating how frequencly notifications should be sent."
          }
        ]
      },
      {
        "name": "NotificationFrequency",
        "summary": "An enumeration of how often to notify someone of an event.",
        "type": "enum",
        "flags": false,
        "enumValues": [
          {
            "name": "Asap",
            "summary": "The user wants to be notified as soon as possible.",
            "value": 1
          },
          {
            "name": "Daily",
            "summary": "The user wants to be notified daily.",
            "value": 3
          },
          {
            "name": "Never",
            "summary": "The user does not want to be notified ever.",
            "value": 2147483647
          }
        ]
      },
      {
        "name": "NotificationChannel",
        "summary": "An enumeration of channels over which notifications may be sent.",
        "type": "enum",
        "flags": true,
        "enumValues": [
          {
            "name": "None",
            "summary": "The user does not want to receive notifications through any channel.",
            "value": 0
          },
          {
            "name": "Email",
            "summary": "The wants to receive notifications by email.",
            "value": 1
          }
        ]
      },
      {
        "name": "PutNotificationSubscriptionConfigurationsResponse",
        "summary": "A record containing the response of a request to put the notification subscription configurations."
      },
      {
        "name": "ListNotificationSubscriptionConfigurationsResponse",
        "summary": "A record containing notification subscription configurations.",
        "type": "composite",
        "members": [
          {
            "name": "subscriptions",
            "type": "NotificationSubscription[]",
            "summary": "The <see cref=\"T:PicMeModel.NotificationSubscription\" />s for the user."
          }
        ]
      },
      {
        "name": "GetUserNotificationEventsResponse",
        "summary": "A record containing the response to a request to get the user's notification events.",
        "type": "composite",
        "members": [
          {
            "name": "events",
            "type": "UserNotificationEvent[]",
            "summary": "An array of <see cref=\"T:PicMeApi.UserNotificationEvent\" />s for the user's notification events."
          },
          {
            "name": "targetEntities",
            "type": "EntityInfo[]",
            "summary": "An array of <see cref=\"T:PicMeApi.EntityInfo\" />s for the target entities."
          },
          {
            "name": "actors",
            "type": "UserInfo[]",
            "summary": "An array of <see cref=\"T:AmbientServices.UserInfo\" />s for the actors that caused the events."
          }
        ]
      },
      {
        "name": "UserNotificationEvent",
        "summary": "A record containing information about a notification event for a specific user.",
        "type": "composite",
        "members": [
          {
            "name": "recipientEntityId",
            "type": "String",
            "summary": "The ID of the recipient entity (usually a user)."
          },
          {
            "name": "scope",
            "type": "DataScope",
            "summary": "The <see cref=\"T:AmbientServices.DataScope\" /> for the event, often a collecction scope."
          },
          {
            "name": "targetEntityTypeId",
            "type": "RecordTypeId",
            "summary": "The <see cref=\"T:AmbientServices.RecordTypeId\" /> for the target entity."
          },
          {
            "name": "targetEntityId",
            "type": "String",
            "summary": "The ID of the event entity."
          },
          {
            "name": "eventType",
            "type": "NotificationDigestEventType",
            "summary": "The <see cref=\"T:PicMeModel.NotificationDigestEventType\" /> indication what type of event happened."
          },
          {
            "name": "eventTime",
            "type": "DateTime",
            "summary": "The <see cref=\"T:System.DateTime\" /> when the event happened."
          },
          {
            "name": "actorId",
            "type": "UserId",
            "summary": "The ID of the entity responsible for causing the event (usually the user that did something)."
          },
          {
            "name": "parameters",
            "type": "String[]?",
            "summary": "Optional parameters specific to the event type."
          },
          {
            "name": "read",
            "type": "Boolean",
            "summary": "Whether or not this notification has been read."
          }
        ]
      },
      {
        "name": "MarkNotificationEventReadResponse",
        "summary": "A record containing the response to <see cref=\"M:PicMeApi.NotificationApis.MarkNotificationEventRead(AmbientServices.IFileSystem,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.RecordTypeId,System.String,PicMeModel.NotificationDigestEventType,System.DateTime,System.String,System.String[])\" />.",
        "type": "composite",
        "members": [
          {
            "name": "updatedEvent",
            "type": "UserNotificationEvent",
            "summary": "The updated <see cref=\"T:PicMeApi.UserNotificationEvent\" />."
          }
        ]
      }
    ]
  },
  {
    "endpoint": "PollHandler",
    "preferredHttpPath": "/a/p",
    "alternateHttpPaths": [
      "/a/HttpPoll"
    ],
    "summary": "Poll-related APIs.",
    "description": "Polls come in two forms, standalone and implicitly associated with another entity.  \n            Standalone polls have a title, description, and a set of choices, each with an ID value and a display value.  \n            Implicit polls are available for any entity--they don\u0027t have a fixed set of choices, a title, or a description, but otherwise function the same.  \n            Poll \u0022selections\u0022 can be made on either type of poll.  \n            Selections are a string (often just a character) that is either the choice ID (if a standalone poll), or whatever you want it to be for implicit polls.  \n            Unicode characters are supported too, so we can use \u00220\u0022 and \u00221\u0022 for like and dislike, or we can use \uD83D\uDC4D and \uD83D\uDC4E directly.   \n            Poll selection details and summaries are available for both standalone polls and other entities.  \n            The poll summary contains a list of all the choices that have been made and how many users have selected that choice (so this can be used to show the number of likes, dislikes, loves, laughs, etc.).  \n            Poll details contain a list of each user that\u0027s made a selection, the choice they selected, and when they selected it (they can change their mind, but that removes any previous entry), so this can be used to show a list of who reacted with what reaction and when they did so.",
    "apis": [
      {
        "name": "PutMyPollSelection",
        "httpMethod": "PUT",
        "httpPathRegex": "^/poll/(?<scope>[^?/&]+)/(?<pollOrEntityTypeId>[^?/&]+)/(?<pollOrEntityId>[^?/&]+)/myselection",
        "subPathPattern": "/poll/{scope}/{pollOrEntityTypeId}/{pollOrEntityId}/myselection",
        "summary": "Submits a poll selection for the currently-authenticated user.",
        "description": "Poll selections can be made on a standalone poll, or an another scoped entity.\n            When using a poll for reactions on photos, for example, the scope is the <see cref=\"T:PicMeModel.CollectionId\" />, and the entity ID is the <see cref=\"T:PicMeModel.UploadId\" />.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "pollOrEntityTypeId",
            "required": true,
            "type": "RecordTypeId",
            "description": "The <see cref=\"T:AmbientServices.RecordTypeId\" /> of the entity indicated by <paramref name=\"pollOrEntityId\" />."
          },
          {
            "name": "pollOrEntityId",
            "required": true,
            "type": "String",
            "description": "A string that is either a <see cref=\"T:AmbientServices.PollId\" /> or another entity ID for which selections can be made."
          },
          {
            "name": "selectedChoiceId",
            "required": true,
            "type": "String",
            "description": "The choice ID string selected by the user (empty string indicates a reaction retraction).  Must not contain any of the following characters: colon, slash, backslash."
          }
        ],
        "return": {
          "type": "PutPollSelectionResponse",
          "description": "A <see cref=\"T:PicMeApi.PutPollSelectionResponse\" /> containing the response."
        }
      },
      {
        "name": "DeleteMyPollSelection",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/poll/(?<scope>[^?/&]+)/(?<pollOrEntityTypeId>[^?/&]+)/(?<pollOrEntityId>[^?/&]+)/myselection",
        "subPathPattern": "/poll/{scope}/{pollOrEntityTypeId}/{pollOrEntityId}/myselection",
        "summary": "Deletes a poll selection for the currently-authenticated user.",
        "description": "Poll selections can be made on a standalone poll, or an another scoped entity.\n            When using a poll for reactions on photos, for example, the scope is the <see cref=\"T:PicMeModel.CollectionId\" />, and the entity ID is the <see cref=\"T:PicMeModel.UploadId\" />.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "pollOrEntityTypeId",
            "required": true,
            "type": "RecordTypeId",
            "description": "The <see cref=\"T:AmbientServices.RecordTypeId\" /> of the entity indicated by <paramref name=\"pollOrEntityId\" />."
          },
          {
            "name": "pollOrEntityId",
            "required": true,
            "type": "String",
            "description": "A string that is either a <see cref=\"T:AmbientServices.PollId\" /> or another entity ID for which selections can be made."
          }
        ],
        "return": {
          "type": "PutPollSelectionResponse",
          "description": "A <see cref=\"T:PicMeApi.PutPollSelectionResponse\" /> containing the response."
        }
      },
      {
        "name": "GetMyPollSelection",
        "httpMethod": "GET",
        "httpPathRegex": "^/poll/(?<scope>[^?/&]+)/(?<pollOrEntityTypeId>[^?/&]+)/(?<pollOrEntityId>[^?/&]+)/myselection",
        "subPathPattern": "/poll/{scope}/{pollOrEntityTypeId}/{pollOrEntityId}/myselection",
        "summary": "Gets any poll selection for the currently-authenticated user.",
        "description": "Poll selections can be made on a standalone poll, or an another scoped entity.\n            When using a poll for reactions on photos, for example, the scope is the <see cref=\"T:PicMeModel.CollectionId\" />, and the entity ID is the <see cref=\"T:PicMeModel.UploadId\" />.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "pollOrEntityTypeId",
            "required": true,
            "type": "RecordTypeId",
            "description": "The <see cref=\"T:AmbientServices.RecordTypeId\" /> of the entity indicated by <paramref name=\"pollOrEntityId\" />."
          },
          {
            "name": "pollOrEntityId",
            "required": true,
            "type": "String",
            "description": "A string that is either a <see cref=\"T:AmbientServices.PollId\" /> or another entity ID for which selections can be made."
          }
        ],
        "return": {
          "type": "GetPollSelectionResponse",
          "description": "A <see cref=\"T:PicMeApi.GetPollSelectionResponse\" /> containing the response."
        }
      },
      {
        "name": "ListPollSelections",
        "httpMethod": "GET",
        "httpPathRegex": "^/poll/(?<scope>[^?/&]+)/(?<pollOrEntityTypeId>[^?/&]+)/(?<pollOrEntityId>[^?/&]+)/selections",
        "subPathPattern": "/poll/{scope}/{pollOrEntityTypeId}/{pollOrEntityId}/selections",
        "summary": "Lists the poll selection details.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "pollOrEntityTypeId",
            "required": true,
            "type": "RecordTypeId",
            "description": "The <see cref=\"T:AmbientServices.RecordTypeId\" /> of the entity indicated by <paramref name=\"pollOrEntityId\" />."
          },
          {
            "name": "pollOrEntityId",
            "required": true,
            "type": "String",
            "description": "A string that is either a <see cref=\"T:AmbientServices.PollId\" /> or another entity ID for which selections can be made."
          },
          {
            "name": "continuation",
            "required": false,
            "type": "String?",
            "description": "An optional string returned from a previous call that will continue listing from where the previous call left off."
          }
        ],
        "return": {
          "type": "ListPollSelectionsResponse",
          "description": "A <see cref=\"T:PicMeApi.ListPollSelectionsResponse\" /> containing the response."
        }
      },
      {
        "name": "ListPollResultSummary",
        "httpMethod": "GET",
        "httpPathRegex": "^/poll/(?<scope>[^?/&]+)/(?<pollOrEntityTypeId>[^?/&]+)/(?<pollOrEntityId>[^?/&]+)/summary",
        "subPathPattern": "/poll/{scope}/{pollOrEntityTypeId}/{pollOrEntityId}/summary",
        "summary": "Lists the poll results summary.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "pollOrEntityTypeId",
            "required": true,
            "type": "RecordTypeId",
            "description": "The <see cref=\"T:AmbientServices.RecordTypeId\" /> of the entity indicated by <paramref name=\"pollOrEntityId\" />."
          },
          {
            "name": "pollOrEntityId",
            "required": true,
            "type": "String",
            "description": "A string that is either a <see cref=\"T:AmbientServices.PollId\" /> or another entity ID for which selections can be made."
          }
        ],
        "return": {
          "type": "ListPollResultSummaryResponse",
          "description": "A <see cref=\"T:PicMeApi.ListPollResultSummaryResponse\" /> containing the response."
        }
      },
      {
        "name": "PatchPoll",
        "httpMethod": "PATCH",
        "httpPathRegex": "^/poll/i/(?<scope>[^?/&]+)/(?<pollId>[^?/&]+)",
        "subPathPattern": "/poll/i/{scope}/{pollId}",
        "summary": "Patches a standalone poll.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "pollId",
            "required": true,
            "type": "PollId",
            "description": "The <see cref=\"T:AmbientServices.PollId\" /> of the poll being patched."
          },
          {
            "name": "body",
            "required": true,
            "type": "PatchPollBody",
            "description": "The <see cref=\"T:PicMeApi.PatchPollBody\" /> containing the partial new poll data."
          }
        ],
        "return": {
          "type": "PatchPollResponse",
          "description": "A <see cref=\"T:PicMeApi.PatchPollResponse\" /> containing the response."
        }
      },
      {
        "name": "DeletePoll",
        "httpMethod": "DELETE",
        "httpPathRegex": "^/poll/i/(?<scope>[^?/&]+)/(?<pollId>[^?/&]+)",
        "subPathPattern": "/poll/i/{scope}/{pollId}",
        "summary": "Deletes the specified standalone poll.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "pollId",
            "required": true,
            "type": "PollId",
            "description": "The <see cref=\"T:AmbientServices.PollId\" /> of the poll being patched."
          }
        ],
        "return": {
          "type": "DeletePollResponse",
          "description": "A <see cref=\"T:PicMeApi.DeletePollResponse\" /> containing the response."
        }
      },
      {
        "name": "CreatePoll",
        "httpMethod": "POST",
        "httpPathRegex": "^/poll/i/(?<scope>[^?/&]+)",
        "subPathPattern": "/poll/i/{scope}",
        "summary": "Creates a standalone poll.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "body",
            "required": true,
            "type": "CreatePollBody",
            "description": "The <see cref=\"T:PicMeApi.CreatePollBody\" /> from the body of the request."
          }
        ],
        "return": {
          "type": "CreatePollResponse",
          "description": "A <see cref=\"T:PicMeApi.CreatePollResponse\" /> containing the response."
        }
      },
      {
        "name": "ListPolls",
        "httpMethod": "GET",
        "httpPathRegex": "^/poll/i/(?<scope>[^?/&]+)",
        "subPathPattern": "/poll/i/{scope}",
        "summary": "Lists standalone polls that the user has rights to.",
        "parameters": [
          {
            "name": "scope",
            "required": true,
            "type": "DataScope",
            "description": "The <see cref=\"T:AmbientServices.DataScope\" /> for the discussion or entity.  (Scopes are kind of like namespaces).  To avoid path parsing issues with empty path segments, use '::' when using the global scope.  When the scope is empty, ie. the discussion is a global (presumably public) discussion."
          },
          {
            "name": "filter",
            "required": false,
            "type": "PollQuery?",
            "description": "An optional <see cref=\"T:PicMeApi.PollQuery\" /> indicating attributes of the polls 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 polls will be listed.  If specified, the caller must be a root administrator."
          }
        ],
        "return": {
          "type": "ListPollsResponse",
          "description": "A <see cref=\"T:PicMeApi.ListPollsResponse\" /> containing the response."
        }
      }
    ],
    "types": [
      {
        "name": "DataScope",
        "summary": "A string that contains a data scope which distinguishes one set of data (records or indexes) from another.\n            It can be part or all of one or more record identifiers or paths, or any other unique string, but must not contain embedded NUL characters.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "RecordTypeId",
        "summary": "A struct that holds a record type identifier.\n            Record type identifiers uniquely identify a specific type of record, but take care, as they can be environment-specific (ie. the same type can have different record type identifiers in different environments).",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "PutPollSelectionResponse",
        "summary": "A record containing the response to <see cref=\"M:PicMeApi.PollApis.PutMyPollSelection(AmbientServices.Auth,AmbientServices.IFileSystem,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.RecordTypeId,System.String,System.String)\" />."
      },
      {
        "name": "GetPollSelectionResponse",
        "summary": "A record containing the response to <see cref=\"M:PicMeApi.PollApis.GetMyPollSelection(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.RecordTypeId,System.String)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "selection",
            "type": "PollSelection?",
            "summary": "The selection made by the user, or null if the user has not made a selection yet."
          }
        ]
      },
      {
        "name": "PollSelection",
        "summary": "A record containing the details for a poll selection.",
        "type": "composite",
        "members": [
          {
            "name": "choiceId",
            "type": "String",
            "summary": "The short string indicating the choice made by this user.  If the string is empty, it represents a user that previously voted and then removed their vote selection."
          },
          {
            "name": "userInfo",
            "type": "ActorInfo",
            "summary": "The <see cref=\"T:AmbientServices.ActorInfo\" /> of the user who made the choice."
          },
          {
            "name": "choiceTime",
            "type": "DateTime",
            "summary": "The <see cref=\"T:System.DateTime\" /> (in UTC) indicating when the specified user made the specified choice."
          }
        ]
      },
      {
        "name": "ActorInfo",
        "summary": "A record containing basic information about a collaborating actor, usually a co-participant in some activity.",
        "type": "composite",
        "members": [
          {
            "name": "userId",
            "type": "ActorId",
            "summary": "The <see cref=\"P:AmbientServices.ActorInfo.UserId\" /> of this user."
          },
          {
            "name": "unavailable",
            "type": "Boolean",
            "summary": "Whether the user's information is available or not.  If not available, an anonymous placeholder name will be used."
          },
          {
            "name": "name",
            "type": "String",
            "summary": "The user's name."
          },
          {
            "name": "getProfilePicture",
            "type": "Uri?",
            "summary": "A <see cref=\"T:System.Uri\" /> that can be used to retrieve the user's profile picture if one is available, or null if there is no profile picture for this user."
          },
          {
            "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": "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": "ListPollSelectionsResponse",
        "summary": "A record containing the response to <see cref=\"M:PicMeApi.PollApis.ListPollSelections(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.RecordTypeId,System.String,System.String)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "selections",
            "type": "PollSelection[]",
            "summary": "The <see cref=\"T:PicMeApi.PollSelection\" />s for each poll choice (choices not included should be assumed to be zero)."
          },
          {
            "name": "continuation",
            "type": "String?",
            "summary": "A string that can be used to get more results in case there were a lot of poll results."
          }
        ]
      },
      {
        "name": "ListPollResultSummaryResponse",
        "summary": "A record containing the response to <see cref=\"M:PicMeApi.PollApis.ListPollResultSummary(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.RecordTypeId,System.String)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "results",
            "type": "PollSummaryEntry[]",
            "summary": "The <see cref=\"T:PicMeApi.PollSummaryEntry\" /> for each poll choice (choices not included should be assumed to be zero)."
          }
        ]
      },
      {
        "name": "PollSummaryEntry",
        "summary": "A record containing the summary (ie. counts) for one poll choice.",
        "type": "composite",
        "members": [
          {
            "name": "choiceId",
            "type": "String",
            "summary": "The short string indicating a choice made by the users counted in <see cref=\"P:PicMeApi.PollSummaryEntry.Count\" />.  If the string is empty, it represents a user that previously voted and then removed their vote selection."
          },
          {
            "name": "count",
            "type": "Int32",
            "summary": "The number of users making that choice."
          }
        ]
      },
      {
        "name": "PollId",
        "summary": "A struct that holds a Compact poll id.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "PatchPollBody",
        "summary": "A record containing the structure of the body for the <see cref=\"M:PicMeApi.PollApis.PatchPoll(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.PollId,PicMeApi.PatchPollBody)\" /> API.\n            Any parts of the structure may be left unspecified, which will cause the existing value to be retained.",
        "type": "composite",
        "members": [
          {
            "name": "name",
            "type": "String?",
            "summary": "The name of the poll."
          },
          {
            "name": "description",
            "type": "Text?",
            "summary": "A description or instructions for the poll."
          },
          {
            "name": "choices",
            "type": "PollChoice[]?",
            "summary": "An array containing the available choices for the poll.  Note that changing the available choices will rename them for any votes already cast."
          },
          {
            "name": "startDate",
            "type": "DateTime?",
            "summary": "An optional <see cref=\"T:System.DateTime\" /> indicating the UTC time after which votes in the poll should start being accepted."
          },
          {
            "name": "endDate",
            "type": "DateTime?",
            "summary": "An optional <see cref=\"T:System.DateTime\" /> indicating the UTC time after which votes in the poll should end being accepted."
          }
        ]
      },
      {
        "name": "PollChoice",
        "summary": "A record containing information about a possible poll choice",
        "type": "composite",
        "members": [
          {
            "name": "choiceId",
            "type": "String",
            "summary": "A unique short string (often a single character) use to store and index the choice made by a user."
          },
          {
            "name": "choiceDisplay",
            "type": "String",
            "summary": "The unique string to display to the user that corresponds to this choice."
          }
        ]
      },
      {
        "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": "PatchPollResponse",
        "summary": "The response for <see cref=\"M:PicMeApi.PollApis.PatchPoll(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,AmbientServices.PollId,PicMeApi.PatchPollBody)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "poll",
            "type": "Poll"
          }
        ]
      },
      {
        "name": "Poll",
        "summary": "A record containing the database schema for a standalone poll.",
        "type": "composite",
        "members": [
          {
            "name": "pollId",
            "type": "PollId",
            "summary": "The <see cref=\"P:PicMeModel.Poll.PollId\" /> for the poll.  Ignored as an input."
          },
          {
            "name": "pollGlobalId",
            "type": "RecordGlobalId",
            "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the poll.  Ignored as an input."
          },
          {
            "name": "creatorUserId",
            "type": "ActorId",
            "summary": "The <see cref=\"T:AmbientServices.ActorId\" /> of the user that created the poll.  Ignored as an input."
          },
          {
            "name": "creationTime",
            "type": "DateTime",
            "summary": "The <see cref=\"T:System.DateTime\" /> when the poll was created.  Ignored as an input."
          },
          {
            "name": "modifierUserId",
            "type": "ActorId",
            "summary": "The <see cref=\"T:AmbientServices.ActorId\" /> of the user that modified the poll.  Ignored as an input."
          },
          {
            "name": "modificationTime",
            "type": "DateTime",
            "summary": "The <see cref=\"T:System.DateTime\" /> when this poll record was modified.  Ignored as an input."
          },
          {
            "name": "startDate",
            "type": "DateTime?",
            "summary": "An optional <see cref=\"T:System.DateTime\" /> that polling starts."
          },
          {
            "name": "endDate",
            "type": "DateTime?",
            "summary": "An optional <see cref=\"T:System.DateTime\" /> that polling ends."
          },
          {
            "name": "name",
            "type": "String",
            "summary": "The poll's name (indexed as a whole)."
          },
          {
            "name": "description",
            "type": "Text",
            "summary": "A description or instructions for the poll."
          },
          {
            "name": "choices",
            "type": "PollChoice[]",
            "summary": "The poll's choices."
          }
        ]
      },
      {
        "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": "DeletePollResponse",
        "summary": "A record containing the response after deleting a colleciton.",
        "type": "composite",
        "members": [
          {
            "name": "pollId",
            "type": "PollId",
            "summary": "The <see cref=\"P:PicMeApi.DeletePollResponse.PollId\" /> for the poll to be deleted."
          },
          {
            "name": "pollGlobalId",
            "type": "RecordGlobalId",
            "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the poll."
          }
        ]
      },
      {
        "name": "CreatePollBody",
        "summary": "A record containing the structure of the body for the <see cref=\"M:PicMeApi.PollApis.CreatePoll(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,PicMeApi.CreatePollBody)\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "name",
            "type": "String",
            "summary": "The name of the poll."
          },
          {
            "name": "description",
            "type": "Text",
            "summary": "A description or instructions for the poll."
          },
          {
            "name": "choices",
            "type": "PollChoice[]",
            "summary": "An array containing the available choices for the poll."
          },
          {
            "name": "startDate",
            "type": "DateTime?",
            "summary": "An optional <see cref=\"T:System.DateTime\" /> indicating the UTC time after which votes in the poll should start being accepted."
          },
          {
            "name": "endDate",
            "type": "DateTime?",
            "summary": "An optional <see cref=\"T:System.DateTime\" /> indicating the UTC time after which votes in the poll should end being accepted."
          }
        ]
      },
      {
        "name": "CreatePollResponse",
        "summary": "The response for <see cref=\"M:PicMeApi.PollApis.CreatePoll(AmbientServices.Auth,AmbientServices.Database,PicMeApi.AuthData,AmbientServices.DataScope,PicMeApi.CreatePollBody)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "pollId",
            "type": "PollId",
            "summary": "The <see cref=\"P:PicMeApi.CreatePollResponse.PollId\" /> for the new standalone poll."
          },
          {
            "name": "pollGlobalId",
            "type": "RecordGlobalId",
            "summary": "The <see cref=\"T:AmbientServices.RecordGlobalId\" /> for the new standalone poll."
          }
        ]
      },
      {
        "name": "PollQuery",
        "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 polls were created."
          },
          {
            "name": "creatorUserId",
            "type": "ActorId?",
            "summary": "An optional <see cref=\"T:AmbientServices.ActorId\" /> who is the creator of the desired polls."
          },
          {
            "name": "modificationTime",
            "type": "DateTimeRange?",
            "summary": "An optional <see cref=\"T:AmbientServices.DateTimeRange\" /> indicating when the desired polls was modified."
          },
          {
            "name": "name",
            "type": "String?",
            "summary": "An optional string whose value should match the name of the polls."
          },
          {
            "name": "description",
            "type": "Text?",
            "summary": "An optional <see cref=\"T:AmbientServices.Text\" /> whose value should match the description of the polls."
          },
          {
            "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": "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": "UserId",
        "summary": "A struct that holds a user identifier.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "ListPollsResponse",
        "summary": "A record containing the response from the <see cref=\"M:PicMeApi.PollApis.ListPolls(AmbientServices.Auth,AmbientServices.Database,AmbientServices.IFileSystem,PicMeApi.AuthData,AmbientServices.DataScope,PicMeApi.PollQuery,System.Int32,System.String,System.Nullable{AmbientServices.UserId})\" /> API.",
        "type": "composite",
        "members": [
          {
            "name": "polls",
            "type": "ListedPoll[]",
            "summary": "An array of <see cref=\"T:PicMeApi.ListedPoll\" /> objects, one for each poll the user has access to."
          },
          {
            "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": "ListedPoll",
        "summary": "A record containing the data for a poll returned in a list of polls.",
        "type": "composite",
        "members": [
          {
            "name": "poll",
            "type": "Poll",
            "summary": "The <see cref=\"P:PicMeApi.ListedPoll.Poll\" /> contining the poll data."
          },
          {
            "name": "userRights",
            "type": "CollectionRights",
            "summary": "The <see cref=\"T:AmbientServices.CollectionRights\" /> indicating what rights the user has on the poll."
          },
          {
            "name": "userParticipationRights",
            "type": "CollectionRights",
            "summary": "The <see cref=\"T:AmbientServices.CollectionRights\" /> indicating what rights the user has on the uploads within the poll."
          }
        ]
      },
      {
        "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
          }
        ]
      }
    ]
  },
  {
    "endpoint": "QrGenerationHandler",
    "preferredHttpPath": "/a/qr",
    "alternateHttpPaths": [
      "/a/HttpQrGeneration"
    ],
    "summary": "QR code image generation-related APIs.",
    "description": "This endpoint provides APIs for generating either PNG or SVG QR code images, but only QR codes that point to approved domains.",
    "apis": [
      {
        "name": "GenerateQrCodePng",
        "httpMethod": "GET",
        "httpPathRegex": "^/pngqr64/(?<hostnamePrefix>[^?/&]+)",
        "subPathPattern": "/pngqr64/{hostnamePrefix}",
        "summary": "Deprecated.  Generates a QR code from the specified parameters.  Currently not authenticated, but the TLD must be {product}.com or localhost, so it shouldn't be particularly useful for third parties.",
        "parameters": [
          {
            "name": "hostnamePrefix",
            "required": true,
            "type": "String",
            "description": "The part of the hostname prior to {product}.com to return (unless running locally, in which case this will be ignored)."
          },
          {
            "name": "pathAndQueryStringPattern",
            "required": true,
            "type": "String",
            "description": "A pattern indicating the path and query string portion of the URL to put into the QR code."
          },
          {
            "name": "useLogo",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to put the product logo in the QR code."
          },
          {
            "name": "colorLogo",
            "required": false,
            "type": "Boolean",
            "description": "Whether to use the colorLogo logo, as opposed to black and white."
          },
          {
            "name": "pixels",
            "required": false,
            "type": "Int32",
            "description": "The number of pixels indicating the size of the desired PNG QR code."
          }
        ],
        "return": {
          "type": "CreateQrCodeImageResponse",
          "description": "A <see cref=\"T:PicMeApi.CreateQrCodeImageResponse\" /> containing the QR code image."
        }
      },
      {
        "name": "GenerateQrCodeSvg",
        "httpMethod": "GET",
        "httpPathRegex": "^/qr64/(?<hostnamePrefix>[^?/&]+)",
        "subPathPattern": "/qr64/{hostnamePrefix}",
        "summary": "Generates a QR code with a logo from the specified parameters.  Currently not authenticated, but the TLD must be {Settings.ProductName.Value.ToLowerInvariant()}.com or localhost, so it shouldn't be particularly useful for third parties.",
        "parameters": [
          {
            "name": "hostnamePrefix",
            "required": true,
            "type": "String",
            "description": "The part of the hostname prior to {Settings.ProductName.Value.ToLowerInvariant()}.com to return (unless running locally, in which case this will be ignored)."
          },
          {
            "name": "pathAndQueryStringPattern",
            "required": true,
            "type": "String",
            "description": "A pattern indicating the path and query string portion of the URL to put into the QR code."
          },
          {
            "name": "useLogo",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to put the product logo in the QR code."
          },
          {
            "name": "colorLogo",
            "required": false,
            "type": "Boolean",
            "description": "Whether to use the colorLogo logo, as opposed to black and white."
          }
        ],
        "return": {
          "type": "CreateQrCodeImageResponse",
          "description": "A <see cref=\"T:PicMeApi.CreateQrCodeImageResponse\" /> containing the QR code image."
        }
      },
      {
        "name": "GenerateTotpQrCodeSvg",
        "httpMethod": "GET",
        "httpPathRegex": "^/totp-svg/(?<algorithm>[^?/&]+)",
        "subPathPattern": "/totp-svg/{algorithm}",
        "summary": "Generates a TOTP QR code with a logo from the specified parameters.  Currently allows unauthenticated access, but the issuer is hardcoded as the appliction name, so it shouldn't be particularly useful for third parties.",
        "parameters": [
          {
            "name": "algorithm",
            "required": true,
            "type": "String",
            "description": "The encryption algorithm to put into the TOTP QR code."
          },
          {
            "name": "accountName",
            "required": true,
            "type": "String",
            "description": "The account name to be put into the QR code string.  This should tell the authenticator app which account to attach the TOTP secret to."
          },
          {
            "name": "secret",
            "required": true,
            "type": "String",
            "description": "The secret to put into the TOTP QR code."
          },
          {
            "name": "digits",
            "required": false,
            "type": "Int32",
            "description": "The number of digits to tell the QR code reader to use when generating the TOTP code."
          },
          {
            "name": "useLogo",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to put the product logo in the QR code."
          },
          {
            "name": "colorLogo",
            "required": false,
            "type": "Boolean",
            "description": "Whether to use the colorLogo logo, as opposed to black and white."
          }
        ],
        "return": {
          "type": "CreateQrCodeImageResponse",
          "description": "A <see cref=\"T:PicMeApi.CreateQrCodeImageResponse\" /> containing the QR code image."
        }
      },
      {
        "name": "GenerateTotpQrCodePng",
        "httpMethod": "GET",
        "httpPathRegex": "^/totp-png/(?<algorithm>[^?/&]+)",
        "subPathPattern": "/totp-png/{algorithm}",
        "summary": "Generates a TOTP QR code with a logo from the specified parameters.  Currently allows unauthenticated access, but the issuer is hardcoded as the appliction name, so it shouldn't be particularly useful for third parties.",
        "parameters": [
          {
            "name": "algorithm",
            "required": true,
            "type": "String",
            "description": "The encryption algorithm to put into the TOTP QR code."
          },
          {
            "name": "accountName",
            "required": true,
            "type": "String",
            "description": "The account name to be put into the QR code string.  This should tell the authenticator app which account to attach the TOTP secret to."
          },
          {
            "name": "secret",
            "required": true,
            "type": "String",
            "description": "The secret to put into the TOTP QR code."
          },
          {
            "name": "digits",
            "required": false,
            "type": "Int32",
            "description": "The number of digits to tell the QR code reader to use when generating the TOTP code."
          },
          {
            "name": "useLogo",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to put the product logo in the QR code."
          },
          {
            "name": "colorLogo",
            "required": false,
            "type": "Boolean",
            "description": "Whether to use the colorLogo logo, as opposed to black and white."
          }
        ],
        "return": {
          "type": "CreateQrCodeImageResponse",
          "description": "A <see cref=\"T:PicMeApi.CreateQrCodeImageResponse\" /> containing the QR code image."
        }
      }
    ],
    "types": [
      {
        "name": "CreateQrCodeImageResponse",
        "summary": "A record containing the response to a request to create a QR code image.",
        "type": "composite",
        "members": [
          {
            "name": "contentType",
            "type": "MimeType",
            "summary": "A <see cref=\"T:AmbientServices.MimeType\" /> containing the RFC MIME-type of the generated image."
          },
          {
            "name": "fileExtension",
            "type": "String",
            "summary": "The appropriate file extension in case the end user wants to save the image."
          },
          {
            "name": "base64Encoded",
            "type": "String",
            "summary": "The BASE-64 encoded image data."
          }
        ]
      },
      {
        "name": "MimeType",
        "summary": "A struct that holds an HTTP MimeType value.",
        "type": "proxy",
        "representedBy": "String"
      }
    ]
  },
  {
    "endpoint": "SsoHandler",
    "preferredHttpPath": "/a/l",
    "alternateHttpPaths": [
      "/a/SsoHandler",
      "/a/HttpSso"
    ],
    "summary": "Single sign-on related APIs.",
    "description": "This endpoint provides APIs for configuring and using single sign-on (SSO) identity providers (IdPs).\n            Currently Google and Apple are supported.\n            Two modes of operation are supported:\n            1. The UI redirects the main page or a popup to the appropriate Start*Authentication API, which redirects to the provider\u0027s login page, which is instructed to redirect back to the API\u0027s callback, which interprets and verifies the response, creates the account or logs the user in, and the redirects back to the UI\u0027s configured target with the access token and refresh tokens in the query string.  If there is an error in the process, a possibly-different target is called with the error code and message in the query string.  The Server never actually renders any UI in this scenario, but it does take control of the browser.\n            2. The UI controls the process, turning control over to the provider and receiving a JWT back from the provider.  The UI then POSTs the JWT to the Continue*Authentication API, which verifies the JWT, creates the account or logs the user in, and returns access and refresh tokens in the response.\n            Information needed to contact the provider can be obtained by the UI using the Get*AuthenticationConfig APIs.\n            System administrators can update that configuration, as well as the associated secrets using the Update*AuthenticationConfig APIs.",
    "apis": [
      {
        "name": "IntermediateGoogleAuthentication",
        "httpMethod": "GET",
        "httpPathRegex": "^/sso/google/callback",
        "subPathPattern": "/sso/google/callback",
        "summary": "Receives the Google Ouath credentials from Google.  This is usually an intermediate callback that doesn't need to be called by the frontend when using the standard setup.",
        "parameters": [
          {
            "name": "code",
            "required": false,
            "type": "String",
            "description": "The authorization code received from Google after successful OAuth authentication."
          },
          {
            "name": "state",
            "required": false,
            "type": "String",
            "description": "The state passed through the OAuth process.  Defaults to all empty state."
          },
          {
            "name": "setTosRead",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to mark the terms of service as having been read/agreed to (which can also happen if it was previously set into <paramref name=\"state\" />).  Defaults to false."
          }
        ],
        "return": {
          "type": "RedirectResponse",
          "description": "A <see cref=\"T:AmbientServices.RedirectResponse\" /> containing the response"
        }
      },
      {
        "name": "IntermediateGoogleAuthentication",
        "httpMethod": "POST",
        "httpPathRegex": "^/sso/google/callback",
        "subPathPattern": "/sso/google/callback",
        "summary": "Receives the Google Ouath credentials from Google.  This is usually an intermediate callback that doesn't need to be called by the frontend when using the standard setup.",
        "parameters": [
          {
            "name": "code",
            "required": false,
            "type": "String",
            "description": "The authorization code received from Google after successful OAuth authentication."
          },
          {
            "name": "state",
            "required": false,
            "type": "String",
            "description": "The state passed through the OAuth process.  Defaults to all empty state."
          },
          {
            "name": "setTosRead",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to mark the terms of service as having been read/agreed to (which can also happen if it was previously set into <paramref name=\"state\" />).  Defaults to false."
          }
        ],
        "return": {
          "type": "RedirectResponse",
          "description": "A <see cref=\"T:AmbientServices.RedirectResponse\" /> containing the response"
        }
      },
      {
        "name": "IntermediateAppleAuthentication",
        "httpMethod": "GET",
        "httpPathRegex": "^/sso/apple/callback",
        "subPathPattern": "/sso/apple/callback",
        "summary": "Receives the Apple Ouath credentials from Apple.  This is usually an intermediate callback that doesn't need to be called by the frontend when using the standard setup.",
        "parameters": [
          {
            "name": "code",
            "required": false,
            "type": "String",
            "description": "The authorization code received from Apple after successful OAuth authentication."
          },
          {
            "name": "state",
            "required": false,
            "type": "String",
            "description": "The state passed through the OAuth process.  Defaults to all empty state."
          },
          {
            "name": "setTosRead",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to mark the terms of service as having been read/agreed to (which can also happen if it was previously set into <paramref name=\"state\" />).  Defaults to false."
          }
        ],
        "return": {
          "type": "RedirectResponse",
          "description": "A <see cref=\"T:AmbientServices.RedirectResponse\" /> containing the response"
        }
      },
      {
        "name": "IntermediateAppleAuthentication",
        "httpMethod": "POST",
        "httpPathRegex": "^/sso/apple/callback",
        "subPathPattern": "/sso/apple/callback",
        "summary": "Receives the Apple Ouath credentials from Apple.  This is usually an intermediate callback that doesn't need to be called by the frontend when using the standard setup.",
        "parameters": [
          {
            "name": "code",
            "required": false,
            "type": "String",
            "description": "The authorization code received from Apple after successful OAuth authentication."
          },
          {
            "name": "state",
            "required": false,
            "type": "String",
            "description": "The state passed through the OAuth process.  Defaults to all empty state."
          },
          {
            "name": "setTosRead",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to mark the terms of service as having been read/agreed to (which can also happen if it was previously set into <paramref name=\"state\" />).  Defaults to false."
          }
        ],
        "return": {
          "type": "RedirectResponse",
          "description": "A <see cref=\"T:AmbientServices.RedirectResponse\" /> containing the response"
        }
      },
      {
        "name": "ContinueGoogleAuthentication",
        "httpMethod": "POST",
        "httpPathRegex": "^/sso/google/jwt",
        "subPathPattern": "/sso/google/jwt",
        "summary": "Processes a JWT token received from Google, using that to complete the Google login process.",
        "parameters": [
          {
            "name": "jwtToken",
            "required": true,
            "type": "String",
            "description": "A JWT token received from Google, but not through the normal web UI flow (ie. possibly from the OS in an app)."
          },
          {
            "name": "allowAccountCreation",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to allow account creation if the Google user doesn't already have an account.  Defaults to true."
          },
          {
            "name": "audience",
            "required": false,
            "type": "String?",
            "description": "The audience the calling application, as configured in the Google developer console.  Defaults to the configured Client ID."
          },
          {
            "name": "setTosRead",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to mark the terms of service as having been read/agreed to.  Defaults to false."
          }
        ],
        "return": {
          "type": "ContinueGoogleAuthenticationResponse",
          "description": "A <see cref=\"T:PicMeApi.ContinueGoogleAuthenticationResponse\" /> containing the response"
        }
      },
      {
        "name": "UpdateGoogleAuthenticationConfig",
        "httpMethod": "PUT",
        "httpPathRegex": "^/config/google",
        "subPathPattern": "/config/google",
        "summary": "Updates the Google OAuth configuration.",
        "parameters": [
          {
            "name": "config",
            "required": true,
            "type": "GoogleAuthConfig",
            "description": "The <see cref=\"T:AmbientServices.GoogleAuthConfig\" /> to store."
          },
          {
            "name": "configName",
            "required": false,
            "type": "String?",
            "description": "The optional name of the SSO configuration to use for accessing the Google OAuth configuration and secrets.  Defaults to the standard Google OAuth configuration."
          }
        ],
        "return": {
          "type": "UpdateGoogleAuthenticationConfigResponse",
          "description": "A <see cref=\"T:PicMeApi.UpdateGoogleAuthenticationConfigResponse\" /> containing the response"
        }
      },
      {
        "name": "GetGoogleAuthenticationConfig",
        "httpMethod": "GET",
        "httpPathRegex": "^/config/google",
        "subPathPattern": "/config/google",
        "summary": "Gets the Google OAuth configuration needed by the client.\n            When <see cref=\"P:PicMeApi.GetGoogleAuthenticationConfigResponse.Available\" /> is false, the client should not display Google authentication.",
        "parameters": [
          {
            "name": "configName",
            "required": false,
            "type": "String?",
            "description": "The optional name of the SSO configuration to use for accessing the Google OAuth configuration and secrets.  Defaults to the standard Google OAuth configuration."
          }
        ],
        "return": {
          "type": "GetGoogleAuthenticationConfigResponse",
          "description": "A <see cref=\"T:PicMeApi.GetGoogleAuthenticationConfigResponse\" /> containing the response"
        }
      },
      {
        "name": "ContinueAppleAuthentication",
        "httpMethod": "POST",
        "httpPathRegex": "^/sso/apple/jwt",
        "subPathPattern": "/sso/apple/jwt",
        "summary": "Processes a JWT token received from Apple, using that to complete the Apple login process.",
        "parameters": [
          {
            "name": "jwtToken",
            "required": true,
            "type": "String",
            "description": "A JWT token received from Apple, but not through the normal web UI flow (ie. possibly from the OS in an app)."
          },
          {
            "name": "allowAccountCreation",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to allow account creation if the Apple user doesn't already have an account.  Defaults to true."
          },
          {
            "name": "audience",
            "required": false,
            "type": "String?",
            "description": "The audience the calling application, as configured in the Apple developer console.  Defaults to the configured Service ID."
          },
          {
            "name": "setTosRead",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to mark the terms of service as having been read/agreed to.  Defaults to false."
          }
        ],
        "return": {
          "type": "ContinueAppleAuthenticationResponse",
          "description": "A <see cref=\"T:PicMeApi.ContinueAppleAuthenticationResponse\" /> containing the response"
        }
      },
      {
        "name": "UpdateAppleAuthenticationConfig",
        "httpMethod": "PUT",
        "httpPathRegex": "^/config/apple",
        "subPathPattern": "/config/apple",
        "summary": "Updates the Apple OAuth configuration.",
        "parameters": [
          {
            "name": "config",
            "required": true,
            "type": "AppleAuthConfig",
            "description": "The <see cref=\"T:AmbientServices.AppleAuthConfig\" /> to store."
          },
          {
            "name": "configName",
            "required": false,
            "type": "String?",
            "description": "The optional name of the SSO configuration to use for accessing the Apple OAuth configuration and secrets.  Defaults to the standard Apple OAuth configuration."
          }
        ],
        "return": {
          "type": "UpdateAppleAuthenticationConfigResponse",
          "description": "A <see cref=\"T:PicMeApi.UpdateAppleAuthenticationConfigResponse\" /> containing the response"
        }
      },
      {
        "name": "GetAppleAuthenticationConfig",
        "httpMethod": "GET",
        "httpPathRegex": "^/config/apple",
        "subPathPattern": "/config/apple",
        "summary": "Gets the Apple OAuth configuration needed by the client.\n            When <see cref=\"P:PicMeApi.GetAppleAuthenticationConfigResponse.Available\" /> is false, the client should not display Apple authentication.",
        "parameters": [
          {
            "name": "configName",
            "required": false,
            "type": "String?",
            "description": "The optional name of the SSO configuration to use for accessing the Apple OAuth configuration and secrets.  Defaults to the standard Apple OAuth configuration."
          }
        ],
        "return": {
          "type": "GetAppleAuthenticationConfigResponse",
          "description": "A <see cref=\"T:PicMeApi.GetAppleAuthenticationConfigResponse\" /> containing the response"
        }
      },
      {
        "name": "StartGoogleAuthentication",
        "httpMethod": "GET",
        "httpPathRegex": "^/sso/google",
        "subPathPattern": "/sso/google",
        "summary": "Kicks off a Google OAuth login by redirecting to the Google OAuth login page.  \n            When the login is complete, the browser will be redirected back to the <see cref=\"T:AmbientServices.SsoAuthCallbackEndpoint\" /> corresponding to <paramref name=\"responseUriId\" />,\n            with the parameters \"access\", \"refresh\", \"type\", and \"expires\" appended to the query string.\n            If there is an error during the authentication process, the browser will be redirected back to the <see cref=\"T:AmbientServices.SsoAuthCallbackEndpoint\" /> corresponding to the \"Error:\" prefixed <paramref name=\"responseUriId\" /> if it exists, or the non-prefixed (success) endpoint if it does not exist.\n            Error conditions (to either endpoint) will have the parameters \"error\" and \"message\" appended to the query string.",
        "parameters": [
          {
            "name": "configName",
            "required": false,
            "type": "String?",
            "description": "The optional name of the SSO configuration to use for accessing the Google OAuth configuration and secrets.  Defaults to the standard Google OAuth configuration."
          },
          {
            "name": "responseUriId",
            "required": false,
            "type": "String",
            "description": "The endpoint ID of the respsonse (callback) URL as specified in the Google SSO configuration.  Defaults to empty string."
          },
          {
            "name": "setTosRead",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to mark the terms of service as having been read/agreed to.  Defaults to false."
          }
        ],
        "return": {
          "type": "RedirectResponse",
          "description": "A <see cref=\"T:AmbientServices.RedirectResponse\" /> containing the response"
        }
      },
      {
        "name": "StartAppleAuthentication",
        "httpMethod": "GET",
        "httpPathRegex": "^/sso/apple",
        "subPathPattern": "/sso/apple",
        "summary": "Kicks off a Apple OAuth login by redirecting to the Apple OAuth login page.  \n            When the login is complete, the browser will be redirected back to the <see cref=\"T:AmbientServices.SsoAuthCallbackEndpoint\" /> corresponding to <paramref name=\"responseUriId\" />,\n            with the parameters \"access\", \"refresh\", \"type\", and \"expires\" appended to the query string.\n            If there is an error during the authentication process, the browser will be redirected back to the <see cref=\"T:AmbientServices.SsoAuthCallbackEndpoint\" /> corresponding to the \"Error:\" prefixed <paramref name=\"responseUriId\" /> if it exists, or the non-prefixed (success) endpoint if it does not exist.\n            Error conditions (to either endpoint) will have the parameters \"error\" and \"message\" appended to the query string.",
        "parameters": [
          {
            "name": "configName",
            "required": false,
            "type": "String?",
            "description": "The optional name of the SSO configuration to use for accessing the Apple OAuth configuration and secrets.  Defaults to the standard Apple OAuth configuration."
          },
          {
            "name": "responseUriId",
            "required": false,
            "type": "String",
            "description": "The endpoint ID of the respsonse (callback) URL as specified in the Apple SSO configuration.  Defaults to empty string."
          },
          {
            "name": "setTosRead",
            "required": false,
            "type": "Boolean",
            "description": "Whether or not to mark the terms of service as having been read/agreed to.  Defaults to false."
          }
        ],
        "return": {
          "type": "RedirectResponse",
          "description": "A <see cref=\"T:AmbientServices.RedirectResponse\" /> containing the response"
        }
      }
    ],
    "types": [
      {
        "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": "ContinueGoogleAuthenticationResponse",
        "summary": "A record containing the response from <see cref=\"M:PicMeApi.SsoApis.ContinueGoogleAuthentication(AmbientServices.Auth,AmbientServices.ExternalEncryptionKeyManager,System.Uri,System.String,System.Boolean,System.String,System.Boolean,System.Net.IPAddress,System.String)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "successfulAuthentication",
            "type": "AuthenticationComplete?",
            "summary": "A <see cref=\"T:AmbientServices.AuthenticationComplete\" /> object with information related to a successful authentication."
          },
          {
            "name": "moreAuthenticationRequired",
            "type": "MoreAuthenticationRequired?",
            "summary": "A <see cref=\"P:PicMeApi.ContinueGoogleAuthenticationResponse.MoreAuthenticationRequired\" /> object with information indicating that more steps are needed to complete authentication."
          }
        ]
      },
      {
        "name": "MoreAuthenticationRequired",
        "summary": "A record whose presence indicates that the user will need to do something else to continue with authentication.\n            Each type contains a ContinueWith*** typed token that should be round-tripped through to a ContinueWith*** API along with the additional information that is specific to the type of extra information needed (new password, MFA code, etc.).",
        "type": "composite",
        "members": [
          {
            "name": "newPasswordRequired",
            "type": "CollectNewPassword?",
            "summary": "A <see cref=\"T:AmbientServices.CollectNewPassword\" /> containing information needed to set a new password."
          },
          {
            "name": "continueWithMfa",
            "type": "ContinueWithMfa?",
            "summary": "A <see cref=\"T:AmbientServices.ContinueWithMfa\" /> containing information needed to finish authenticating with multi-factor authentication."
          },
          {
            "name": "continueWithSigningChallenge",
            "type": "ContinueWithSigningChallenge?",
            "summary": "A <see cref=\"T:AmbientServices.ContinueWithSigningChallenge\" /> containing information needed to finish authenticating using certificate signing."
          }
        ]
      },
      {
        "name": "ContinueWithSigningChallenge",
        "summary": "A record containing data needed to complete login with multi-factor authentication, using either email or an authenticator app.",
        "type": "composite",
        "members": [
          {
            "name": "nonce",
            "type": "String",
            "summary": "A random one-time use string that the caller must sign with the certificate and return in an authentication continuation API call."
          }
        ]
      },
      {
        "name": "ContinueWithMfa",
        "summary": "A record containing data needed to complete login with multi-factor authentication, using either email or an authenticator app.",
        "type": "composite",
        "members": [
          {
            "name": "token",
            "type": "SignedSecurityToken",
            "summary": "A <see cref=\"T:AmbientServices.SignedSecurityToken\" /> that contains the signed MFA security token."
          }
        ]
      },
      {
        "name": "SignedSecurityToken",
        "summary": "A struct that holds a PicMe collection sharing authorization code.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "CollectNewPassword",
        "summary": "A record containing data needed to set a new password.",
        "type": "composite",
        "members": [
          {
            "name": "token",
            "type": "NewPasswordChallengeToken",
            "summary": "A <see cref=\"T:AmbientServices.NewPasswordChallengeToken\" /> that can be used to set a new password."
          }
        ]
      },
      {
        "name": "NewPasswordChallengeToken",
        "summary": "A struct that holds a password challenge token.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "AuthenticationComplete",
        "summary": "A record containing the response to a request to authenticate or refresh authentication.",
        "type": "composite",
        "members": [
          {
            "name": "authenticated",
            "type": "UserAuthenticated",
            "summary": "A <see cref=\"T:AmbientServices.UserAuthenticated\" /> object containing authentication information."
          },
          {
            "name": "authenticatedUser",
            "type": "UserData",
            "summary": "<see cref=\"T:AmbientServices.UserData\" /> for the authenticated user."
          }
        ]
      },
      {
        "name": "UserData",
        "summary": "A record containing a selective copy of information about a user.",
        "type": "composite",
        "members": [
          {
            "name": "userId",
            "type": "UserId",
            "summary": "The user's <see cref=\"P:AmbientServices.UserData.UserId\" />, which uniquely identifies this user account."
          },
          {
            "name": "userGlobalId",
            "type": "RecordGlobalId",
            "summary": "A <see cref=\"T:AmbientServices.RecordGlobalId\" /> that can be used to generically identify the user record."
          },
          {
            "name": "email",
            "type": "String",
            "summary": "A possibly-empty email address for the user."
          },
          {
            "name": "name",
            "type": "String",
            "summary": "A possibly-empty name (firstname/lastname) for the user."
          },
          {
            "name": "phoneNumber",
            "type": "String",
            "summary": "A possibly-empty phone number for the user."
          },
          {
            "name": "emailVerified",
            "type": "Boolean",
            "summary": "Whether or not the email address has been verified."
          },
          {
            "name": "phoneNumberVerified",
            "type": "Boolean",
            "summary": "Whether or not the phone number has been verified."
          },
          {
            "name": "termsOfServiceRead",
            "type": "Boolean",
            "summary": "Whether or not the terms of service have been read and agreed to."
          },
          {
            "name": "isRegistered",
            "type": "Boolean",
            "summary": "Whether or not the user is \"registered\"."
          },
          {
            "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": "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": "UserId",
        "summary": "A struct that holds a user identifier.",
        "type": "proxy",
        "representedBy": "String"
      },
      {
        "name": "UserAuthenticated",
        "summary": "A record containing authentication information.",
        "type": "composite",
        "members": [
          {
            "name": "accessToken",
            "type": "SignedSecurityToken",
            "summary": "The temporary access token."
          },
          {
            "name": "tokenType",
            "type": "String",
            "summary": "The token type.  Currently always \"Bearer\"."
          },
          {
            "name": "refreshToken",
            "type": "SignedSecurityToken",
            "summary": "The more long-term refresh token.  For guest accounts, there is no account password, so this is a permanent token stored in the app, or in the browser data."
          },
          {
            "name": "expiresInSeconds",
            "type": "Int32",
            "summary": "The number of seconds that <paramref name=\"AccessToken\" /> will last before needing to be refreshed."
          },
          {
            "name": "serverTime",
            "type": "DateTime",
            "summary": "The server time in case there is a discrepancy with the client."
          }
        ]
      },
      {
        "name": "GoogleAuthConfig",
        "summary": "A record containing Google-specific authentication configuration.",
        "type": "composite",
        "members": [
          {
            "name": "googleLoginEndpoint",
            "type": "String?",
            "summary": "The Google login endpoint URL."
          },
          {
            "name": "googleTokenExchangeEndpoint",
            "type": "String?",
            "summary": "The URL to exchange a Google authentication code for a JWT."
          },
          {
            "name": "googleJwtValidationEndpoint",
            "type": "String?",
            "summary": "The URL used to validate the Google JWT."
          },
          {
            "name": "googleClientId",
            "type": "String",
            "summary": "The Google Client ID."
          },
          {
            "name": "googleClientSecret",
            "type": "String",
            "summary": "The Google Client Secret."
          },
          {
            "name": "googleProjectId",
            "type": "String?",
            "summary": "The Google Project ID."
          },
          {
            "name": "endpoints",
            "type": "SsoAuthCallbackEndpoint[]",
            "summary": "The array of <see cref=\"T:AmbientServices.SsoAuthCallbackEndpoint\" />s to use for callback endpoints."
          }
        ]
      },
      {
        "name": "SsoAuthCallbackEndpoint",
        "summary": "A record containing an auth callback endpoint and the corresonding redirect URL.",
        "type": "composite",
        "members": [
          {
            "name": "endpointId",
            "type": "String",
            "summary": "A string that uniquely identifies this endpoint.  The empty string endpoint is the default.  Endpoints should come in pairs with an \"Error:\" prefix for the corresponding error endpoint (\"Error:\" by itself is the default error endpoint)."
          },
          {
            "name": "endpointUri",
            "type": "String",
            "summary": "The URI to redirect to when this endpoint's name is specified at the start of the SSO login process.  The URI may contain {access}, {refresh}, {code}, {message}, {type}, {expires}, and/or {requestErrorId} either in the path or query string to indicate where it is desired."
          }
        ]
      },
      {
        "name": "UpdateGoogleAuthenticationConfigResponse",
        "summary": "A record containing the response to a request to set the Google authentication configuration."
      },
      {
        "name": "GetGoogleAuthenticationConfigResponse",
        "summary": "A record containing the response to a request to get the Google authentication configuration.",
        "type": "composite",
        "members": [
          {
            "name": "available",
            "type": "Boolean",
            "summary": "Whether Google SSO is configured and enabled for this request."
          },
          {
            "name": "googleClientId",
            "type": "String?",
            "summary": "The Google Client ID the client should use for Google OuAth SSO, or null when <paramref name=\"Available\" /> is false."
          },
          {
            "name": "endpoints",
            "type": "SsoAuthCallbackEndpoint[]?",
            "summary": "The named <see cref=\"T:System.Uri\" />s that should be redirected to on completion, or null when <paramref name=\"Available\" /> is false."
          }
        ]
      },
      {
        "name": "ContinueAppleAuthenticationResponse",
        "summary": "A record containing the response from <see cref=\"M:PicMeApi.SsoApis.ContinueAppleAuthentication(AmbientServices.Auth,AmbientServices.ExternalEncryptionKeyManager,System.Uri,System.String,System.Boolean,System.String,System.Boolean,System.Net.IPAddress,System.String)\" />.",
        "type": "composite",
        "members": [
          {
            "name": "successfulAuthentication",
            "type": "AuthenticationComplete?",
            "summary": "A <see cref=\"T:AmbientServices.AuthenticationComplete\" /> object with information related to a successful authentication."
          },
          {
            "name": "moreAuthenticationRequired",
            "type": "MoreAuthenticationRequired?",
            "summary": "A <see cref=\"P:PicMeApi.ContinueAppleAuthenticationResponse.MoreAuthenticationRequired\" /> object with information indicating that more steps are needed to complete authentication."
          }
        ]
      },
      {
        "name": "AppleAuthConfig",
        "summary": "A record containing Apple-specific authentication configuration.",
        "type": "composite",
        "members": [
          {
            "name": "appleLoginEndpoint",
            "type": "String?",
            "summary": "The Apple login endpoint."
          },
          {
            "name": "appleTokenExchangeEndpoint",
            "type": "String?",
            "summary": "The Apple code exchange endpoint."
          },
          {
            "name": "appleJwtValidationEndpoint",
            "type": "String?",
            "summary": "The Apple JWT validation endpoint."
          },
          {
            "name": "appleServiceId",
            "type": "String",
            "summary": "The Apple service ID."
          },
          {
            "name": "appleTeamId",
            "type": "String",
            "summary": "The Apple team ID."
          },
          {
            "name": "appleKeyId",
            "type": "String",
            "summary": "The Apple key ID."
          },
          {
            "name": "appleKey",
            "type": "String",
            "summary": "The Apple key."
          },
          {
            "name": "endpoints",
            "type": "SsoAuthCallbackEndpoint[]",
            "summary": "The list of <see cref=\"T:AmbientServices.SsoAuthCallbackEndpoint\" />s to use for Apple SSO."
          }
        ]
      },
      {
        "name": "UpdateAppleAuthenticationConfigResponse",
        "summary": "A record containing the response to a request to set the Apple authentication configuration."
      },
      {
        "name": "GetAppleAuthenticationConfigResponse",
        "summary": "A record containing the response to a request to get the Apple authentication configuration.",
        "type": "composite",
        "members": [
          {
            "name": "available",
            "type": "Boolean",
            "summary": "Whether Apple web SSO is configured, enabled, and supported for this request."
          },
          {
            "name": "appleServiceId",
            "type": "String?",
            "summary": "The Apple Service ID the client should use for Apple OAth SSO, or null when <paramref name=\"Available\" /> is false."
          },
          {
            "name": "endpoints",
            "type": "SsoAuthCallbackEndpoint[]?",
            "summary": "The named <see cref=\"T:System.Uri\" />s that should be redirected to on completion, or null when <paramref name=\"Available\" /> is false."
          }
        ]
      }
    ]
  }
]