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).

graph LR
  A[Your App] --> B[(Bucket)]
  B --> C[object: aerial.dwg]
  B --> D[object: office_plan.rvt]
  B --> E[object: bridge.ifc]

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
Warning

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] 524288000

2.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 persistent

List 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       8388608

2.4 Delete Objects and Buckets

Remove a specific file:

resp <- deleteObject(token = myToken, bucket = "mybucket", object = "aerial.dwg")
resp$status_code
#> [1] 200

Remove the whole bucket:

resp <- deleteBucket(token = myToken, bucket = "mybucket")
resp$status_code
#> [1] 200
Warning

Empty 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"