@lap v0.3
# Machine-readable API spec. Each @endpoint block is one API call.
@api Cloud Storage JSON API
@base https://storage.googleapis.com/storage/v1
@version v1
@auth OAuth2 | OAuth2
@common_fields {userProject: str}
@endpoints 52
@hint download_for_search
@toc b(45), channels(1), projects(6)

@group b
@endpoint GET /b
@required {project: str}
@optional {maxResults: int, pageToken: str, prefix: str, projection: str(full/noAcl)}
@returns(200) {items: [map], kind: str, nextPageToken: str}

@endpoint POST /b
@required {project: str}
@optional {predefinedAcl: str(authenticatedRead/private/projectPrivate/publicRead/publicReadWrite), predefinedDefaultObjectAcl: str(authenticatedRead/bucketOwnerFullControl/bucketOwnerRead/private/projectPrivate/publicRead), projection: str(full/noAcl), acl: [map{bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, id: str, kind: str, projectTeam: map, role: str, selfLink: str}], autoclass: map{enabled: bool, toggleTime: str(date-time)}, billing: map{requesterPays: bool}, cors: [map{maxAgeSeconds: int(int32), method: [str], origin: [str], responseHeader: [str]}], customPlacementConfig: map{dataLocations: [str]}, defaultEventBasedHold: bool, defaultObjectAcl: [map{bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map, role: str, selfLink: str}], encryption: map{defaultKmsKeyName: str}, etag: str, iamConfiguration: map{bucketPolicyOnly: map, publicAccessPrevention: str, uniformBucketLevelAccess: map}, id: str, kind: str=storage#bucket, labels: map, lifecycle: map{rule: [map]}, location: str, locationType: str, logging: map{logBucket: str, logObjectPrefix: str}, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, projectNumber: str(uint64), retentionPolicy: map{effectiveTime: str(date-time), isLocked: bool, retentionPeriod: str(int64)}, rpo: str, satisfiesPZS: bool, selfLink: str, storageClass: str, timeCreated: str(date-time), updated: str(date-time), versioning: map{enabled: bool}, website: map{mainPageSuffix: str, notFoundPage: str}}
@returns(200) {acl: [map], autoclass: map{enabled: bool, toggleTime: str(date-time)}, billing: map{requesterPays: bool}, cors: [map], customPlacementConfig: map{dataLocations: [str]}, defaultEventBasedHold: bool, defaultObjectAcl: [map], encryption: map{defaultKmsKeyName: str}, etag: str, iamConfiguration: map{bucketPolicyOnly: map{enabled: bool, lockedTime: str(date-time)}, publicAccessPrevention: str, uniformBucketLevelAccess: map{enabled: bool, lockedTime: str(date-time)}}, id: str, kind: str, labels: map, lifecycle: map{rule: [map]}, location: str, locationType: str, logging: map{logBucket: str, logObjectPrefix: str}, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, projectNumber: str(uint64), retentionPolicy: map{effectiveTime: str(date-time), isLocked: bool, retentionPeriod: str(int64)}, rpo: str, satisfiesPZS: bool, selfLink: str, storageClass: str, timeCreated: str(date-time), updated: str(date-time), versioning: map{enabled: bool}, website: map{mainPageSuffix: str, notFoundPage: str}}

@endpoint DELETE /b/{bucket}
@required {bucket: str}
@optional {ifMetagenerationMatch: str, ifMetagenerationNotMatch: str}
@returns(200)

@endpoint GET /b/{bucket}
@required {bucket: str}
@optional {ifMetagenerationMatch: str, ifMetagenerationNotMatch: str, projection: str(full/noAcl)}
@returns(200) {acl: [map], autoclass: map{enabled: bool, toggleTime: str(date-time)}, billing: map{requesterPays: bool}, cors: [map], customPlacementConfig: map{dataLocations: [str]}, defaultEventBasedHold: bool, defaultObjectAcl: [map], encryption: map{defaultKmsKeyName: str}, etag: str, iamConfiguration: map{bucketPolicyOnly: map{enabled: bool, lockedTime: str(date-time)}, publicAccessPrevention: str, uniformBucketLevelAccess: map{enabled: bool, lockedTime: str(date-time)}}, id: str, kind: str, labels: map, lifecycle: map{rule: [map]}, location: str, locationType: str, logging: map{logBucket: str, logObjectPrefix: str}, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, projectNumber: str(uint64), retentionPolicy: map{effectiveTime: str(date-time), isLocked: bool, retentionPeriod: str(int64)}, rpo: str, satisfiesPZS: bool, selfLink: str, storageClass: str, timeCreated: str(date-time), updated: str(date-time), versioning: map{enabled: bool}, website: map{mainPageSuffix: str, notFoundPage: str}}

@endpoint PATCH /b/{bucket}
@required {bucket: str}
@optional {ifMetagenerationMatch: str, ifMetagenerationNotMatch: str, predefinedAcl: str(authenticatedRead/private/projectPrivate/publicRead/publicReadWrite), predefinedDefaultObjectAcl: str(authenticatedRead/bucketOwnerFullControl/bucketOwnerRead/private/projectPrivate/publicRead), projection: str(full/noAcl), acl: [map{bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, id: str, kind: str, projectTeam: map, role: str, selfLink: str}], autoclass: map{enabled: bool, toggleTime: str(date-time)}, billing: map{requesterPays: bool}, cors: [map{maxAgeSeconds: int(int32), method: [str], origin: [str], responseHeader: [str]}], customPlacementConfig: map{dataLocations: [str]}, defaultEventBasedHold: bool, defaultObjectAcl: [map{bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map, role: str, selfLink: str}], encryption: map{defaultKmsKeyName: str}, etag: str, iamConfiguration: map{bucketPolicyOnly: map, publicAccessPrevention: str, uniformBucketLevelAccess: map}, id: str, kind: str=storage#bucket, labels: map, lifecycle: map{rule: [map]}, location: str, locationType: str, logging: map{logBucket: str, logObjectPrefix: str}, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, projectNumber: str(uint64), retentionPolicy: map{effectiveTime: str(date-time), isLocked: bool, retentionPeriod: str(int64)}, rpo: str, satisfiesPZS: bool, selfLink: str, storageClass: str, timeCreated: str(date-time), updated: str(date-time), versioning: map{enabled: bool}, website: map{mainPageSuffix: str, notFoundPage: str}}
@returns(200) {acl: [map], autoclass: map{enabled: bool, toggleTime: str(date-time)}, billing: map{requesterPays: bool}, cors: [map], customPlacementConfig: map{dataLocations: [str]}, defaultEventBasedHold: bool, defaultObjectAcl: [map], encryption: map{defaultKmsKeyName: str}, etag: str, iamConfiguration: map{bucketPolicyOnly: map{enabled: bool, lockedTime: str(date-time)}, publicAccessPrevention: str, uniformBucketLevelAccess: map{enabled: bool, lockedTime: str(date-time)}}, id: str, kind: str, labels: map, lifecycle: map{rule: [map]}, location: str, locationType: str, logging: map{logBucket: str, logObjectPrefix: str}, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, projectNumber: str(uint64), retentionPolicy: map{effectiveTime: str(date-time), isLocked: bool, retentionPeriod: str(int64)}, rpo: str, satisfiesPZS: bool, selfLink: str, storageClass: str, timeCreated: str(date-time), updated: str(date-time), versioning: map{enabled: bool}, website: map{mainPageSuffix: str, notFoundPage: str}}

@endpoint PUT /b/{bucket}
@required {bucket: str}
@optional {ifMetagenerationMatch: str, ifMetagenerationNotMatch: str, predefinedAcl: str(authenticatedRead/private/projectPrivate/publicRead/publicReadWrite), predefinedDefaultObjectAcl: str(authenticatedRead/bucketOwnerFullControl/bucketOwnerRead/private/projectPrivate/publicRead), projection: str(full/noAcl), acl: [map{bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, id: str, kind: str, projectTeam: map, role: str, selfLink: str}], autoclass: map{enabled: bool, toggleTime: str(date-time)}, billing: map{requesterPays: bool}, cors: [map{maxAgeSeconds: int(int32), method: [str], origin: [str], responseHeader: [str]}], customPlacementConfig: map{dataLocations: [str]}, defaultEventBasedHold: bool, defaultObjectAcl: [map{bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map, role: str, selfLink: str}], encryption: map{defaultKmsKeyName: str}, etag: str, iamConfiguration: map{bucketPolicyOnly: map, publicAccessPrevention: str, uniformBucketLevelAccess: map}, id: str, kind: str=storage#bucket, labels: map, lifecycle: map{rule: [map]}, location: str, locationType: str, logging: map{logBucket: str, logObjectPrefix: str}, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, projectNumber: str(uint64), retentionPolicy: map{effectiveTime: str(date-time), isLocked: bool, retentionPeriod: str(int64)}, rpo: str, satisfiesPZS: bool, selfLink: str, storageClass: str, timeCreated: str(date-time), updated: str(date-time), versioning: map{enabled: bool}, website: map{mainPageSuffix: str, notFoundPage: str}}
@returns(200) {acl: [map], autoclass: map{enabled: bool, toggleTime: str(date-time)}, billing: map{requesterPays: bool}, cors: [map], customPlacementConfig: map{dataLocations: [str]}, defaultEventBasedHold: bool, defaultObjectAcl: [map], encryption: map{defaultKmsKeyName: str}, etag: str, iamConfiguration: map{bucketPolicyOnly: map{enabled: bool, lockedTime: str(date-time)}, publicAccessPrevention: str, uniformBucketLevelAccess: map{enabled: bool, lockedTime: str(date-time)}}, id: str, kind: str, labels: map, lifecycle: map{rule: [map]}, location: str, locationType: str, logging: map{logBucket: str, logObjectPrefix: str}, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, projectNumber: str(uint64), retentionPolicy: map{effectiveTime: str(date-time), isLocked: bool, retentionPeriod: str(int64)}, rpo: str, satisfiesPZS: bool, selfLink: str, storageClass: str, timeCreated: str(date-time), updated: str(date-time), versioning: map{enabled: bool}, website: map{mainPageSuffix: str, notFoundPage: str}}

@endpoint GET /b/{bucket}/acl
@required {bucket: str}
@returns(200) {items: [map], kind: str}

@endpoint POST /b/{bucket}/acl
@required {bucket: str}
@optional {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, id: str, kind: str=storage#bucketAccessControl, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}
@returns(200) {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, id: str, kind: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}

@endpoint DELETE /b/{bucket}/acl/{entity}
@required {bucket: str, entity: str}
@returns(200)

@endpoint GET /b/{bucket}/acl/{entity}
@required {bucket: str, entity: str}
@returns(200) {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, id: str, kind: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}

@endpoint PATCH /b/{bucket}/acl/{entity}
@required {bucket: str, entity: str}
@optional {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, id: str, kind: str=storage#bucketAccessControl, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}
@returns(200) {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, id: str, kind: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}

@endpoint PUT /b/{bucket}/acl/{entity}
@required {bucket: str, entity: str}
@optional {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, id: str, kind: str=storage#bucketAccessControl, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}
@returns(200) {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, id: str, kind: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}

@endpoint GET /b/{bucket}/defaultObjectAcl
@required {bucket: str}
@optional {ifMetagenerationMatch: str, ifMetagenerationNotMatch: str}
@returns(200) {items: [map], kind: str}

@endpoint POST /b/{bucket}/defaultObjectAcl
@required {bucket: str}
@optional {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str=storage#objectAccessControl, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}
@returns(200) {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}

@endpoint DELETE /b/{bucket}/defaultObjectAcl/{entity}
@required {bucket: str, entity: str}
@returns(200)

@endpoint GET /b/{bucket}/defaultObjectAcl/{entity}
@required {bucket: str, entity: str}
@returns(200) {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}

@endpoint PATCH /b/{bucket}/defaultObjectAcl/{entity}
@required {bucket: str, entity: str}
@optional {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str=storage#objectAccessControl, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}
@returns(200) {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}

@endpoint PUT /b/{bucket}/defaultObjectAcl/{entity}
@required {bucket: str, entity: str}
@optional {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str=storage#objectAccessControl, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}
@returns(200) {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}

@endpoint GET /b/{bucket}/iam
@required {bucket: str}
@optional {optionsRequestedPolicyVersion: int}
@returns(200) {bindings: [map], etag: str(byte), kind: str, resourceId: str, version: int(int32)}

@endpoint PUT /b/{bucket}/iam
@required {bucket: str}
@optional {bindings: [map{condition: map, members: [str], role: str}], etag: str(byte), kind: str=storage#policy, resourceId: str, version: int(int32)}
@returns(200) {bindings: [map], etag: str(byte), kind: str, resourceId: str, version: int(int32)}

@endpoint GET /b/{bucket}/iam/testPermissions
@required {bucket: str, permissions: [str]}
@returns(200) {kind: str, permissions: [str]}

@endpoint POST /b/{bucket}/lockRetentionPolicy
@required {bucket: str, ifMetagenerationMatch: str}
@returns(200) {acl: [map], autoclass: map{enabled: bool, toggleTime: str(date-time)}, billing: map{requesterPays: bool}, cors: [map], customPlacementConfig: map{dataLocations: [str]}, defaultEventBasedHold: bool, defaultObjectAcl: [map], encryption: map{defaultKmsKeyName: str}, etag: str, iamConfiguration: map{bucketPolicyOnly: map{enabled: bool, lockedTime: str(date-time)}, publicAccessPrevention: str, uniformBucketLevelAccess: map{enabled: bool, lockedTime: str(date-time)}}, id: str, kind: str, labels: map, lifecycle: map{rule: [map]}, location: str, locationType: str, logging: map{logBucket: str, logObjectPrefix: str}, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, projectNumber: str(uint64), retentionPolicy: map{effectiveTime: str(date-time), isLocked: bool, retentionPeriod: str(int64)}, rpo: str, satisfiesPZS: bool, selfLink: str, storageClass: str, timeCreated: str(date-time), updated: str(date-time), versioning: map{enabled: bool}, website: map{mainPageSuffix: str, notFoundPage: str}}

@endpoint GET /b/{bucket}/notificationConfigs
@required {bucket: str}
@returns(200) {items: [map], kind: str}

@endpoint POST /b/{bucket}/notificationConfigs
@required {bucket: str}
@optional {custom_attributes: map, etag: str, event_types: [str], id: str, kind: str=storage#notification, object_name_prefix: str, payload_format: str=JSON_API_V1, selfLink: str, topic: str}
@returns(200) {custom_attributes: map, etag: str, event_types: [str], id: str, kind: str, object_name_prefix: str, payload_format: str, selfLink: str, topic: str}

@endpoint DELETE /b/{bucket}/notificationConfigs/{notification}
@required {bucket: str, notification: str}
@returns(200)

@endpoint GET /b/{bucket}/notificationConfigs/{notification}
@required {bucket: str, notification: str}
@returns(200) {custom_attributes: map, etag: str, event_types: [str], id: str, kind: str, object_name_prefix: str, payload_format: str, selfLink: str, topic: str}

@endpoint GET /b/{bucket}/o
@required {bucket: str}
@optional {delimiter: str, endOffset: str, includeTrailingDelimiter: bool, matchGlob: str, maxResults: int, pageToken: str, prefix: str, projection: str(full/noAcl), startOffset: str, versions: bool}
@returns(200) {items: [map], kind: str, nextPageToken: str, prefixes: [str]}

@endpoint POST /b/{bucket}/o
@required {bucket: str}
@optional {contentEncoding: str, ifGenerationMatch: str, ifGenerationNotMatch: str, ifMetagenerationMatch: str, ifMetagenerationNotMatch: str, kmsKeyName: str, name: str, predefinedAcl: str(authenticatedRead/bucketOwnerFullControl/bucketOwnerRead/private/projectPrivate/publicRead), projection: str(full/noAcl)}
@returns(200) {acl: [map], bucket: str, cacheControl: str, componentCount: int(int32), contentDisposition: str, contentEncoding: str, contentLanguage: str, contentType: str, crc32c: str, customTime: str(date-time), customerEncryption: map{encryptionAlgorithm: str, keySha256: str}, etag: str, eventBasedHold: bool, generation: str(int64), id: str, kind: str, kmsKeyName: str, md5Hash: str, mediaLink: str, metadata: map, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, retentionExpirationTime: str(date-time), selfLink: str, size: str(uint64), storageClass: str, temporaryHold: bool, timeCreated: str(date-time), timeDeleted: str(date-time), timeStorageClassUpdated: str(date-time), updated: str(date-time)}

@endpoint POST /b/{bucket}/o/watch
@required {bucket: str}
@optional {delimiter: str, endOffset: str, includeTrailingDelimiter: bool, maxResults: int, pageToken: str, prefix: str, projection: str(full/noAcl), startOffset: str, versions: bool, address: str, expiration: str(int64), id: str, kind: str=api#channel, params: map, payload: bool, resourceId: str, resourceUri: str, token: str, type: str}
@returns(200) {address: str, expiration: str(int64), id: str, kind: str, params: map, payload: bool, resourceId: str, resourceUri: str, token: str, type: str}

@endpoint DELETE /b/{bucket}/o/{object}
@required {bucket: str, object: str}
@optional {generation: str, ifGenerationMatch: str, ifGenerationNotMatch: str, ifMetagenerationMatch: str, ifMetagenerationNotMatch: str}
@returns(200)

@endpoint GET /b/{bucket}/o/{object}
@required {bucket: str, object: str}
@optional {generation: str, ifGenerationMatch: str, ifGenerationNotMatch: str, ifMetagenerationMatch: str, ifMetagenerationNotMatch: str, projection: str(full/noAcl)}
@returns(200) {acl: [map], bucket: str, cacheControl: str, componentCount: int(int32), contentDisposition: str, contentEncoding: str, contentLanguage: str, contentType: str, crc32c: str, customTime: str(date-time), customerEncryption: map{encryptionAlgorithm: str, keySha256: str}, etag: str, eventBasedHold: bool, generation: str(int64), id: str, kind: str, kmsKeyName: str, md5Hash: str, mediaLink: str, metadata: map, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, retentionExpirationTime: str(date-time), selfLink: str, size: str(uint64), storageClass: str, temporaryHold: bool, timeCreated: str(date-time), timeDeleted: str(date-time), timeStorageClassUpdated: str(date-time), updated: str(date-time)}

@endpoint PATCH /b/{bucket}/o/{object}
@required {bucket: str, object: str}
@optional {generation: str, ifGenerationMatch: str, ifGenerationNotMatch: str, ifMetagenerationMatch: str, ifMetagenerationNotMatch: str, predefinedAcl: str(authenticatedRead/bucketOwnerFullControl/bucketOwnerRead/private/projectPrivate/publicRead), projection: str(full/noAcl), acl: [map{bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map, role: str, selfLink: str}], bucket: str, cacheControl: str, componentCount: int(int32), contentDisposition: str, contentEncoding: str, contentLanguage: str, contentType: str, crc32c: str, customTime: str(date-time), customerEncryption: map{encryptionAlgorithm: str, keySha256: str}, etag: str, eventBasedHold: bool, generation: str(int64), id: str, kind: str=storage#object, kmsKeyName: str, md5Hash: str, mediaLink: str, metadata: map, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, retentionExpirationTime: str(date-time), selfLink: str, size: str(uint64), storageClass: str, temporaryHold: bool, timeCreated: str(date-time), timeDeleted: str(date-time), timeStorageClassUpdated: str(date-time), updated: str(date-time)}
@returns(200) {acl: [map], bucket: str, cacheControl: str, componentCount: int(int32), contentDisposition: str, contentEncoding: str, contentLanguage: str, contentType: str, crc32c: str, customTime: str(date-time), customerEncryption: map{encryptionAlgorithm: str, keySha256: str}, etag: str, eventBasedHold: bool, generation: str(int64), id: str, kind: str, kmsKeyName: str, md5Hash: str, mediaLink: str, metadata: map, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, retentionExpirationTime: str(date-time), selfLink: str, size: str(uint64), storageClass: str, temporaryHold: bool, timeCreated: str(date-time), timeDeleted: str(date-time), timeStorageClassUpdated: str(date-time), updated: str(date-time)}

@endpoint PUT /b/{bucket}/o/{object}
@required {bucket: str, object: str}
@optional {generation: str, ifGenerationMatch: str, ifGenerationNotMatch: str, ifMetagenerationMatch: str, ifMetagenerationNotMatch: str, predefinedAcl: str(authenticatedRead/bucketOwnerFullControl/bucketOwnerRead/private/projectPrivate/publicRead), projection: str(full/noAcl), acl: [map{bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map, role: str, selfLink: str}], bucket: str, cacheControl: str, componentCount: int(int32), contentDisposition: str, contentEncoding: str, contentLanguage: str, contentType: str, crc32c: str, customTime: str(date-time), customerEncryption: map{encryptionAlgorithm: str, keySha256: str}, etag: str, eventBasedHold: bool, generation: str(int64), id: str, kind: str=storage#object, kmsKeyName: str, md5Hash: str, mediaLink: str, metadata: map, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, retentionExpirationTime: str(date-time), selfLink: str, size: str(uint64), storageClass: str, temporaryHold: bool, timeCreated: str(date-time), timeDeleted: str(date-time), timeStorageClassUpdated: str(date-time), updated: str(date-time)}
@returns(200) {acl: [map], bucket: str, cacheControl: str, componentCount: int(int32), contentDisposition: str, contentEncoding: str, contentLanguage: str, contentType: str, crc32c: str, customTime: str(date-time), customerEncryption: map{encryptionAlgorithm: str, keySha256: str}, etag: str, eventBasedHold: bool, generation: str(int64), id: str, kind: str, kmsKeyName: str, md5Hash: str, mediaLink: str, metadata: map, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, retentionExpirationTime: str(date-time), selfLink: str, size: str(uint64), storageClass: str, temporaryHold: bool, timeCreated: str(date-time), timeDeleted: str(date-time), timeStorageClassUpdated: str(date-time), updated: str(date-time)}

@endpoint GET /b/{bucket}/o/{object}/acl
@required {bucket: str, object: str}
@optional {generation: str}
@returns(200) {items: [map], kind: str}

@endpoint POST /b/{bucket}/o/{object}/acl
@required {bucket: str, object: str}
@optional {generation: str, bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str=storage#objectAccessControl, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}
@returns(200) {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}

@endpoint DELETE /b/{bucket}/o/{object}/acl/{entity}
@required {bucket: str, object: str, entity: str}
@optional {generation: str}
@returns(200)

@endpoint GET /b/{bucket}/o/{object}/acl/{entity}
@required {bucket: str, object: str, entity: str}
@optional {generation: str}
@returns(200) {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}

@endpoint PATCH /b/{bucket}/o/{object}/acl/{entity}
@required {bucket: str, object: str, entity: str}
@optional {generation: str, bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str=storage#objectAccessControl, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}
@returns(200) {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}

@endpoint PUT /b/{bucket}/o/{object}/acl/{entity}
@required {bucket: str, object: str, entity: str}
@optional {generation: str, bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str=storage#objectAccessControl, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}
@returns(200) {bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map{projectNumber: str, team: str}, role: str, selfLink: str}

@endpoint GET /b/{bucket}/o/{object}/iam
@required {bucket: str, object: str}
@optional {generation: str}
@returns(200) {bindings: [map], etag: str(byte), kind: str, resourceId: str, version: int(int32)}

@endpoint PUT /b/{bucket}/o/{object}/iam
@required {bucket: str, object: str}
@optional {generation: str, bindings: [map{condition: map, members: [str], role: str}], etag: str(byte), kind: str=storage#policy, resourceId: str, version: int(int32)}
@returns(200) {bindings: [map], etag: str(byte), kind: str, resourceId: str, version: int(int32)}

@endpoint GET /b/{bucket}/o/{object}/iam/testPermissions
@required {bucket: str, object: str, permissions: [str]}
@optional {generation: str}
@returns(200) {kind: str, permissions: [str]}

@endpoint POST /b/{destinationBucket}/o/{destinationObject}/compose
@required {destinationBucket: str, destinationObject: str}
@optional {destinationPredefinedAcl: str(authenticatedRead/bucketOwnerFullControl/bucketOwnerRead/private/projectPrivate/publicRead), ifGenerationMatch: str, ifMetagenerationMatch: str, kmsKeyName: str, destination: map{acl: [map], bucket: str, cacheControl: str, componentCount: int(int32), contentDisposition: str, contentEncoding: str, contentLanguage: str, contentType: str, crc32c: str, customTime: str(date-time), customerEncryption: map, etag: str, eventBasedHold: bool, generation: str(int64), id: str, kind: str, kmsKeyName: str, md5Hash: str, mediaLink: str, metadata: map, metageneration: str(int64), name: str, owner: map, retentionExpirationTime: str(date-time), selfLink: str, size: str(uint64), storageClass: str, temporaryHold: bool, timeCreated: str(date-time), timeDeleted: str(date-time), timeStorageClassUpdated: str(date-time), updated: str(date-time)}, kind: str=storage#composeRequest, sourceObjects: [map{generation: str(int64), name: str, objectPreconditions: map}]}
@returns(200) {acl: [map], bucket: str, cacheControl: str, componentCount: int(int32), contentDisposition: str, contentEncoding: str, contentLanguage: str, contentType: str, crc32c: str, customTime: str(date-time), customerEncryption: map{encryptionAlgorithm: str, keySha256: str}, etag: str, eventBasedHold: bool, generation: str(int64), id: str, kind: str, kmsKeyName: str, md5Hash: str, mediaLink: str, metadata: map, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, retentionExpirationTime: str(date-time), selfLink: str, size: str(uint64), storageClass: str, temporaryHold: bool, timeCreated: str(date-time), timeDeleted: str(date-time), timeStorageClassUpdated: str(date-time), updated: str(date-time)}

@endpoint POST /b/{sourceBucket}/o/{sourceObject}/copyTo/b/{destinationBucket}/o/{destinationObject}
@required {sourceBucket: str, sourceObject: str, destinationBucket: str, destinationObject: str}
@optional {destinationKmsKeyName: str, destinationPredefinedAcl: str(authenticatedRead/bucketOwnerFullControl/bucketOwnerRead/private/projectPrivate/publicRead), ifGenerationMatch: str, ifGenerationNotMatch: str, ifMetagenerationMatch: str, ifMetagenerationNotMatch: str, ifSourceGenerationMatch: str, ifSourceGenerationNotMatch: str, ifSourceMetagenerationMatch: str, ifSourceMetagenerationNotMatch: str, projection: str(full/noAcl), sourceGeneration: str, acl: [map{bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map, role: str, selfLink: str}], bucket: str, cacheControl: str, componentCount: int(int32), contentDisposition: str, contentEncoding: str, contentLanguage: str, contentType: str, crc32c: str, customTime: str(date-time), customerEncryption: map{encryptionAlgorithm: str, keySha256: str}, etag: str, eventBasedHold: bool, generation: str(int64), id: str, kind: str=storage#object, kmsKeyName: str, md5Hash: str, mediaLink: str, metadata: map, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, retentionExpirationTime: str(date-time), selfLink: str, size: str(uint64), storageClass: str, temporaryHold: bool, timeCreated: str(date-time), timeDeleted: str(date-time), timeStorageClassUpdated: str(date-time), updated: str(date-time)}
@returns(200) {acl: [map], bucket: str, cacheControl: str, componentCount: int(int32), contentDisposition: str, contentEncoding: str, contentLanguage: str, contentType: str, crc32c: str, customTime: str(date-time), customerEncryption: map{encryptionAlgorithm: str, keySha256: str}, etag: str, eventBasedHold: bool, generation: str(int64), id: str, kind: str, kmsKeyName: str, md5Hash: str, mediaLink: str, metadata: map, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, retentionExpirationTime: str(date-time), selfLink: str, size: str(uint64), storageClass: str, temporaryHold: bool, timeCreated: str(date-time), timeDeleted: str(date-time), timeStorageClassUpdated: str(date-time), updated: str(date-time)}

@endpoint POST /b/{sourceBucket}/o/{sourceObject}/rewriteTo/b/{destinationBucket}/o/{destinationObject}
@required {sourceBucket: str, sourceObject: str, destinationBucket: str, destinationObject: str}
@optional {destinationKmsKeyName: str, destinationPredefinedAcl: str(authenticatedRead/bucketOwnerFullControl/bucketOwnerRead/private/projectPrivate/publicRead), ifGenerationMatch: str, ifGenerationNotMatch: str, ifMetagenerationMatch: str, ifMetagenerationNotMatch: str, ifSourceGenerationMatch: str, ifSourceGenerationNotMatch: str, ifSourceMetagenerationMatch: str, ifSourceMetagenerationNotMatch: str, maxBytesRewrittenPerCall: str, projection: str(full/noAcl), rewriteToken: str, sourceGeneration: str, acl: [map{bucket: str, domain: str, email: str, entity: str, entityId: str, etag: str, generation: str(int64), id: str, kind: str, object: str, projectTeam: map, role: str, selfLink: str}], bucket: str, cacheControl: str, componentCount: int(int32), contentDisposition: str, contentEncoding: str, contentLanguage: str, contentType: str, crc32c: str, customTime: str(date-time), customerEncryption: map{encryptionAlgorithm: str, keySha256: str}, etag: str, eventBasedHold: bool, generation: str(int64), id: str, kind: str=storage#object, kmsKeyName: str, md5Hash: str, mediaLink: str, metadata: map, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, retentionExpirationTime: str(date-time), selfLink: str, size: str(uint64), storageClass: str, temporaryHold: bool, timeCreated: str(date-time), timeDeleted: str(date-time), timeStorageClassUpdated: str(date-time), updated: str(date-time)}
@returns(200) {done: bool, kind: str, objectSize: str(int64), resource: map{acl: [map], bucket: str, cacheControl: str, componentCount: int(int32), contentDisposition: str, contentEncoding: str, contentLanguage: str, contentType: str, crc32c: str, customTime: str(date-time), customerEncryption: map{encryptionAlgorithm: str, keySha256: str}, etag: str, eventBasedHold: bool, generation: str(int64), id: str, kind: str, kmsKeyName: str, md5Hash: str, mediaLink: str, metadata: map, metageneration: str(int64), name: str, owner: map{entity: str, entityId: str}, retentionExpirationTime: str(date-time), selfLink: str, size: str(uint64), storageClass: str, temporaryHold: bool, timeCreated: str(date-time), timeDeleted: str(date-time), timeStorageClassUpdated: str(date-time), updated: str(date-time)}, rewriteToken: str, totalBytesRewritten: str(int64)}

@endgroup

@group channels
@endpoint POST /channels/stop
@optional {address: str, expiration: str(int64), id: str, kind: str=api#channel, params: map, payload: bool, resourceId: str, resourceUri: str, token: str, type: str}
@returns(200)

@endgroup

@group projects
@endpoint GET /projects/{projectId}/hmacKeys
@required {projectId: str}
@optional {maxResults: int, pageToken: str, serviceAccountEmail: str, showDeletedKeys: bool}
@returns(200) {items: [map], kind: str, nextPageToken: str}

@endpoint POST /projects/{projectId}/hmacKeys
@required {projectId: str, serviceAccountEmail: str}
@returns(200) {kind: str, metadata: map{accessId: str, etag: str, id: str, kind: str, projectId: str, selfLink: str, serviceAccountEmail: str, state: str, timeCreated: str(date-time), updated: str(date-time)}, secret: str}

@endpoint DELETE /projects/{projectId}/hmacKeys/{accessId}
@required {projectId: str, accessId: str}
@returns(200)

@endpoint GET /projects/{projectId}/hmacKeys/{accessId}
@required {projectId: str, accessId: str}
@returns(200) {accessId: str, etag: str, id: str, kind: str, projectId: str, selfLink: str, serviceAccountEmail: str, state: str, timeCreated: str(date-time), updated: str(date-time)}

@endpoint PUT /projects/{projectId}/hmacKeys/{accessId}
@required {projectId: str, accessId: str}
@optional {accessId: str, etag: str, id: str, kind: str=storage#hmacKeyMetadata, projectId: str, selfLink: str, serviceAccountEmail: str, state: str, timeCreated: str(date-time), updated: str(date-time)}
@returns(200) {accessId: str, etag: str, id: str, kind: str, projectId: str, selfLink: str, serviceAccountEmail: str, state: str, timeCreated: str(date-time), updated: str(date-time)}

@endpoint GET /projects/{projectId}/serviceAccount
@required {projectId: str}
@returns(200) {email_address: str, kind: str}

@endgroup

@end
