graph LR A[Your App] --> B[(Bucket)] B --> C[object: aerial.dwg] B --> D[object: office_plan.rvt] B --> E[object: bridge.ifc]
2 Data Management
Think of the Data Management API as AutoDesk’s cloud file system. Before you can translate a file, embed it in a viewer, or run Design Automation on it, the file needs to live up in APS storage. This chapter covers everything from creating a bucket to deleting one.
The storage model is simple: your app owns buckets, and buckets hold objects (your files).
2.1 Create a Bucket
Get a token first - bucket creation needs bucket:create and bucket:read scopes at minimum:
resp <- getToken(
id = Sys.getenv("client_id"),
secret = Sys.getenv("client_secret"),
scope = "bucket:create bucket:read data:write"
)
myToken <- resp$content$access_token
#> [1] "eyJhbGciOiJSUzI1NiIsImtpZCI6IlU3c1BKNVVpOWNaVjlIR2FhX1pIeDhEd3VYSHcifQ..."Bucket retention policy controls how long your objects stick around:
| Policy | Files live for |
|---|---|
"transient" |
24 hours (great for testing) |
"temporary" |
30 days |
"persistent" |
Until you delete them |
Bucket names are globally unique — not just within your app, but across every APS application everywhere. A name like "test" is long gone. Use something specific to your organisation and project, e.g. "acmecorp-bridge-analysis-prod". A duplicate name returns a 409 Conflict:
resp$status_code
#> [1] 409
resp$content$reason
#> [1] "Bucket already exists"resp <- makeBucket(token = myToken, bucket = "mybucket", policy = "persistent")
resp$content
#> $bucketKey
#> [1] "mybucket"
#>
#> $bucketOwner
#> [1] "3MVG99OxTyEMCQ3gNp2PjtXbmT8T_MnfCTtpQkuiJNxGtXuoKP7"
#>
#> $createdDate
#> [1] 1745356800000
#>
#> $policyKey
#> [1] "persistent"Check on a bucket anytime with checkBucket():
resp <- checkBucket(token = myToken, bucket = "mybucket")
resp$content$policyKey
#> [1] "persistent"2.2 Upload a File
uploadFile() handles files up to 100 MB. It returns the object’s objectId, a URN that every other API will ask for, so save it somewhere handy:
resp <- uploadFile(
file = system.file("samples/aerial.dwg", package = "AutoDeskR"),
token = myToken,
bucket = "mybucket"
)
myUrn <- resp$content$objectId
resp$content
#> $bucketKey
#> [1] "mybucket"
#>
#> $objectId
#> [1] "urn:adsk.objects:os.object:mybucket/aerial.dwg"
#>
#> $objectKey
#> [1] "aerial.dwg"
#>
#> $size
#> [1] 3145728
#>
#> $contentType
#> [1] "application/octet-stream"
#>
#> $location
#> [1] "https://developer.api.autodesk.com/oss/v2/buckets/mybucket/objects/aerial.dwg"2.2.1 Big Files (> 100 MB)
For anything over 100 MB, use uploadFileSigned(). iI routes the transfer through signed S3 URLs to sidestep timeout limits:
resp <- uploadFileSigned(
file = "path/to/large_model.rvt",
token = myToken,
bucket = "mybucket"
)
myUrn <- resp$content$objectId
resp$content$size
#> [1] 5242880002.3 List Buckets and Objects
See all buckets your app owns. Paginate with limit and startAt:
resp <- listBuckets(token = myToken, limit = 10)
resp$content$items
#> bucketKey createdDate policyKey
#> 1 mybucket 1745356800000 persistent
#> 2 archive-2025 1740000000000 temporary
#> 3 visualization-dev 1738000000000 transient
# Next page
resp <- listBuckets(token = myToken, limit = 10, startAt = "visualization-dev")Filter by region if your app spans geographies:
resp <- listBuckets(token = myToken, region = "EMEA")
resp$content$items
#> bucketKey createdDate policyKey
#> 1 emea-models 1742000000000 persistentList the files inside a bucket:
resp <- listObjects(token = myToken, bucket = "mybucket", limit = 10)
resp$content$items
#> objectKey objectId size
#> 1 aerial.dwg urn:adsk.objects:os.object:mybucket/aerial.dwg 3145728
#> 2 office_plan.rvt urn:adsk.objects:os.object:mybucket/office_plan.rvt 52428800
#> 3 bridge.ifc urn:adsk.objects:os.object:mybucket/bridge.ifc 83886082.4 Delete Objects and Buckets
Remove a specific file:
resp <- deleteObject(token = myToken, bucket = "mybucket", object = "aerial.dwg")
resp$status_code
#> [1] 200Remove the whole bucket:
resp <- deleteBucket(token = myToken, bucket = "mybucket")
resp$status_code
#> [1] 200Empty the bucket first. deleteBucket() won’t touch a bucket that still has objects in it. Delete everything with deleteObject() first, or you’ll get:
resp$status_code
#> [1] 409
resp$content$reason
#> [1] "Bucket not empty"