{"id":15350590,"url":"https://github.com/gaul/undocumented-s3-apis","last_synced_at":"2025-09-19T20:46:24.299Z","repository":{"id":144979713,"uuid":"191065424","full_name":"gaul/undocumented-s3-apis","owner":"gaul","description":"Undocumented Amazon S3 APIs and third-party extensions","archived":false,"fork":false,"pushed_at":"2022-02-20T08:43:38.000Z","size":3,"stargazers_count":70,"open_issues_count":4,"forks_count":3,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-09-10T23:19:36.659Z","etag":null,"topics":["amazon-s3","api","documentation","s3"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gaul.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-06-09T23:23:29.000Z","updated_at":"2025-04-17T00:52:49.000Z","dependencies_parsed_at":"2023-04-11T03:17:23.618Z","dependency_job_id":null,"html_url":"https://github.com/gaul/undocumented-s3-apis","commit_stats":{"total_commits":6,"total_committers":1,"mean_commits":6.0,"dds":0.0,"last_synced_commit":"8b32961e83452e9fe5812b1095cc6974d32689ce"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gaul/undocumented-s3-apis","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaul%2Fundocumented-s3-apis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaul%2Fundocumented-s3-apis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaul%2Fundocumented-s3-apis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaul%2Fundocumented-s3-apis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gaul","download_url":"https://codeload.github.com/gaul/undocumented-s3-apis/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaul%2Fundocumented-s3-apis/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275998868,"owners_count":25567391,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-19T02:00:09.700Z","response_time":108,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amazon-s3","api","documentation","s3"],"created_at":"2024-10-01T11:58:46.397Z","updated_at":"2025-09-19T20:46:24.269Z","avatar_url":"https://github.com/gaul.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Undocumented S3 APIs\n\nUndocumented Amazon S3 APIs and third-party extensions.  This documents\nfeatures outside the official\n[Amazon S3 REST APIs](https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html).\nNote that these are not consistently supported across implementations.\n\n## Amazon APIs\n\n### GET object by multipart number\n\nObject metadata exposes the number of multipart upload parts via the\n`x-amz-mp-parts-count` header.  Subsequent GET object requests can retrieve\nindividual parts via the `partNumber` parameter.  This allows retrieving\nindividual multipart upload parts, including the original ETag.\n\n* [AWS Java SDK partNumber](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/GetObjectMetadataRequest.html#withPartNumber-java.lang.Integer-)\n* [AWS Java SDK x-amz-mp-parts-count](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/ObjectMetadata.html#getPartCount--)\n\n### HEAD bucket exposes region\n\nHEAD bucket exposes the region via `x-amz-bucket-region` even if the request\nlacks authentication.  This allows clients to interrogate a bucket so that they\ncan route subsequent requests to the correct endpoint.\n\n### Multipart Upload ETag\n\nSingle part upload ETag are the MD5 hash of the object content.  Multipart\nupload ETag concatenate the MD5 of each part, MD5 this data, and append a\nhyphen and the number of parts.\n\n* [Stack Overflow answer](https://stackoverflow.com/questions/12186993/what-is-the-algorithm-to-compute-the-amazon-s3-etag-for-a-file-larger-than-5gb)\n\n## Third-party APIs\n\n### GET bucket unordered\n\n`allow-unordered=true` parameter overrides key sorting which allows higher\nperformance with large buckets.  Cannot be used with delimiter.\n\n* [Ceph documentation](http://docs.ceph.com/docs/master/radosgw/s3/bucketops/#get-bucket)\n\n### HEAD bucket extended\n\nReturns bucket statistics via `x-rgw-bytes-used` and `x-rgw-object-count`\nheaders.\n\n* [Ceph feature #2313](https://tracker.ceph.com/issues/2313)\n\n### PUT object append\n\nAppend to an existing object at a given offset via the `append` and `position`\nparameters.  Responses include `x-oss-next-append-position` and\n`x-rgw-next-append-position` which indicate the next valid append offset.\n\n* [Aliyun documentation](https://partners-intl.aliyun.com/help/doc-detail/31981.htm?spm=a2c63.p38356.b99.595.5783438dGk)\n* [Ceph documentation](http://docs.ceph.com/docs/master/radosgw/s3/objectops/#append-object)\n\n### PUT object conditional\n\n`If-Match` and `If-None-Match` (Ceph) and `x-goog-if-generation-match` and\n`x-goog-if-metageneration-match` (Google) headers allow atomic replacement of\nobjects.\n\n* [Ceph feature #8562](https://tracker.ceph.com/issues/8562)\n* [Google Cloud Storage documentation](https://cloud.google.com/storage/docs/generations-preconditions#_XMLAPI)\n\n### Resumable uploads\n\nInitiate a resumable upload with POST object with the `x-goog-resumable`\nheader.  Use the response `Location` to issue a PUT object with given\nContent-Length and Content-Range headers.  Continuing issuing these requests to\nbuild larger objects.\n\n* [Google Cloud Storage documentation](https://cloud.google.com/storage/docs/xml-api/resumable-upload)\n\n### Small file archives\n\nAllows interaction with ZIP file contents as if they were objects.  HeadObject,\nGetObject, and ListObjectsV2 support these operations when the header\n`x-minio-extract` has a `true` value.\n\n* [Minio documentation](https://blog.min.io/small-file-archives/)\n\n## References\n\n* [Aliyun API documentation](https://partners-intl.aliyun.com/help/doc-detail/31947.htm?spm=a2c63.p38356.b99.563.3d3152e7qsZxhf)\n* [Amazon API documentation](https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html)\n* [Ceph API documentation](http://docs.ceph.com/docs/master/radosgw/s3/)\n* [Google API documentation](https://cloud.google.com/storage/docs/xml-api/overview)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaul%2Fundocumented-s3-apis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgaul%2Fundocumented-s3-apis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaul%2Fundocumented-s3-apis/lists"}