/v4/accounts and /v4/me (the account id from /v4/me doesn’t exist in the result of /v4/accounts)
/v4/me response has my personal account
/v4/accounts response only has enterprise account.
1 post - 1 participant
]]>I am reaching out to clarify some conflicting information our team has been receiving in regards to the Frame io Enterprise API capabilities.
Is there additional API functionality available in Enterprise accounts as opposed to Team accounts?
Thanks
CM1776
3 posts - 2 participants
]]>The Frame.io Python SDK v1.2.1 (frameio) now ships with a built-in uploader that handles chunked multi-part uploads to S3 end to end. No more hand-rolling pre-signed URL chunking, retry logic, or parallel PUT orchestration — the SDK takes care of it.
The new frameio.upload module introduces FrameioUploader:
| Capability | What it does |
|---|---|
| Chunked uploads | Splits your file into chunks matching the pre-signed URLs returned by the API |
| Parallel PUTs | Uploads chunks concurrently via a thread pool (5 workers by default) |
| Automatic retries | Retries failed chunks with exponential backoff (1s, 2s, 4s, …) |
| Progress callbacks | on_progress(bytes_uploaded, total_bytes) fires after each chunk |
| Remote upload | One-call helper for URL-based uploads under 50 GB |
Uploads go directly from your application to S3 — they don’t pass through Frame.io’s API servers.
pip install frameio --upgrade
import os
from frameio import Frameio
from frameio.files import FileCreateLocalUploadParamsData
from frameio.upload import FrameioUploader
client = Frameio(token="YOUR_TOKEN")
file_path = "/path/to/video.mp4"
file_size = os.path.getsize(file_path)
# 1. Create the file resource and get pre-signed upload URLs
response = client.files.create_local_upload(
account_id="YOUR_ACCOUNT_ID",
folder_id="YOUR_FOLDER_ID",
data=FileCreateLocalUploadParamsData(
name="video.mp4",
file_size=file_size,
),
)
# 2. Upload the file to S3
with open(file_path, "rb") as f:
FrameioUploader(response.data, f).upload()
That’s it — the SDK chunks the file, uploads in parallel, and retries on failure.
def on_progress(uploaded: int, total: int) -> None:
pct = uploaded / total * 100
print(f"\r{pct:.1f}% ({uploaded:,} / {total:,} bytes)", end="", flush=True)
with open(file_path, "rb") as f:
FrameioUploader(response.data, f, on_progress=on_progress).upload()
For a polished terminal experience, plug the callback into a Rich progress bar:
from rich.progress import Progress, BarColumn, DownloadColumn, TransferSpeedColumn, TimeRemainingColumn
with Progress(
"[progress.description]{task.description}",
BarColumn(), DownloadColumn(), TransferSpeedColumn(), TimeRemainingColumn(),
) as progress:
task = progress.add_task("Uploading...", total=file_size)
with open(file_path, "rb") as f:
FrameioUploader(
response.data, f,
on_progress=lambda done, total: progress.update(task, completed=done),
).upload()
max_workers for high-bandwidth connectionsmax_retries on flaky networks (exponential backoff)from frameio.files import FileCreateRemoteUploadParamsData
response = client.files.create_remote_upload(
account_id="YOUR_ACCOUNT_ID",
folder_id="YOUR_FOLDER_ID",
data=FileCreateRemoteUploadParamsData(
name="video.mp4",
source_url="https://example.com/video.mp4",
),
)
Remote upload currently has a 50 GB file size limit — use local upload for anything larger.
After uploading, verify completion:
status = client.files.show_file_upload_status(
account_id="YOUR_ACCOUNT_ID",
file_id=response.data.id,
)
print(f"Upload complete: {status.data.upload_complete}")
We’d love to hear how it works for you. If you run into issues or have feature requests reply to this post!
1 post - 1 participant
]]>We’ve set up a server in my company to do a OAuth Single-Page App. The server is reachable and is accepted at the Configure OAuth Single-Page App credential page. However at the page to Configure API when saved it says “API Configuration Failed: Please try again”. It is not clear what the issue is.
Is there a way of debugging to get this working please.
Joe
3 posts - 2 participants
]]>3 posts - 2 participants
]]>Hi support,
We’re building an internal creative review dashboard that needs to pull video thumbnails via the API. Our account was migrated to Adobe infrastructure (from_adobe: true on our user profile).
What’s happening:
Our Developer Token (fio-u-…) successfully authenticates against GET /v2/me and returns our user profile (account ID: a4ce***********af4, user: hello@bu###.com)
However, ALL asset/project/folder endpoints return 404 Not Found on REST v2
GraphQL queries for assets return PERMISSION_DENIED
This includes projects and assets we can access fine in the web UI
What we need:
REST v2 GET /v2/assets/{asset_id} to return asset details including thumbnail URLs
Or GraphQL asset(assetId: “…”) queries to work
Specifically, we need thumb_256 / thumb_540 fields from video assets for display in our dashboard
Our project/folder IDs (accessible in web UI but not via API):
Project: b5df2802
Folder : all
Questions:
After Adobe migration, do Developer Tokens need to be regenerated with specific scopes?
Is there a different auth flow required for Adobe-migrated accounts (e.g. Adobe IMS tokens)?
Are there any workspace/team-level permissions that need to be enabled for API access?
Our Developer Token was generated from the developer portal. We also have OAuth client credentials configured (client_id: 2b72************************************6259) but the access token returns 401.
Thanks,
2 posts - 2 participants
]]>Setup:
openid, profile, email, offline_access, additional_info.rolesWhat works:
GET /v2/me → 200
(returns user info)
Adobe IMS token exchange → valid JWT ![]()
What fails (all 403):
GET /v4/me
GET /v4/accounts
GET /v4/accounts/{id}/workspaces
The token is a valid Adobe IMS JWT. The /v2/me endpoint confirms the token is accepted. But all /v4/* routes return a plain 403 Forbidden HTML page (not a JSON error).
Is there an account-level provisioning step required for V4 API access? Or are we missing a scope?
2 posts - 2 participants
]]>Redirect URI
https://dashboard.mydomain.net/api/auth/callback/frameio
Redirect URI Pattern
https://localhost:3000/api/auth/callback/frameio|https://staging-dashboard\\.mydomain\\.net/api/auth/callback/frameio|https://dashboard\\.mydomain\\.net/api/auth/callback/frameio
The redirect works fine for localhost, it’s just staging gets redirected to production instead.
Any ideas?
Thanks!
3 posts - 2 participants
]]>So does that mean the API endpoints in the V4 API documentation would not work if I were to connect my work adobe account? Should I even try?
This might be a niche question, but I’ve been so curious about it so if anyone knows or can sort of figure out what I’m talking about with me having to give specifics I’m not sure of or allowed to, that would be great.
Thanks!
Nancy
4 posts - 3 participants
]]>2 posts - 2 participants
]]>We’ve just added the /search endpoint to the experimental API! This endpoint calls the same search engines that power the search bar in the Frame.io web app. In fact, you can even choose which engine to run your search with.
We see this endpoint being incredibly useful for a lot of integrations and workflows, and would love to get some feedback on how it’s working for you. For feedback on quality of search results, we can route those to our search team if necessary – but we’d love to see feedback on the endpoint itself.
Getting Started
It’s incredibly simple to set up. All you need to do is choose your search engine (lexical for standard search or nlp for natural language/semantic search) and pass your search query. The endpoint will search across the specified account and return a list of matches.
data: {
"engine": "nlp",
"query": "YOUR SEARCH QUERY"
}
If you’d like you can also filter by asset type:
data: {
"engine": "nlp",
"query": "YOUR SEARCH QUERY",
"filters":
{
"files_and_version_stacks": "true",
"folders": "false",
"projects": "false"
}
Advanced Workflows
You can even use the nlp engine to search against more specific parameters by using a tokenized query string. Let’s say your workflow needs to find assets based on filename, limited to a project, and with a specific Status value.
//Capture these from the user
filename = "my_file.mov"
project = "{project_id}"
status = "In Progress"
query_string = "{filename} in project {project_id} with Status {status}"
data: {
"engine": "nlp",
"query": query_string,
"filters":
{
"files_and_version_stacks": "true",
"folders": "false",
"projects": "false"
}
1 post - 1 participant
]]>4 posts - 2 participants
]]>We’ve been using the Frame.io v2 api (via the python SDK) for some time now. Today our users have been unable to get our tools to work. client.teams.list_all() was returning an empty list.
I did some digging and saw there was a new V4 api so I wanted to give that a shot (via the new python SDK). Following the migration guide I added `x-frameio-legacy-token-auth` to the headers so we can continue to use our legacy tokens and now when I run: client.workspaces.index(<user_id>) I get a 401 unauthorized error code. I’m able to get_me().
We have to use the legacy tokens since we currently do not license frame.io through adobe but still through our original plan.
Is there some authorization limitations with the legacy tokens? Is there some other issue I’m not aware of?
import frameio
token = "<token>"
headers = {'x-frameio-legacy-token-auth': 'true'}
client = frameio.Frameio(token=token, headers=headers)
client_data = client.users.show()
account_id = client.users.show().data.id
client.workspaces.index(account_id=account_id) # Raises 401 error.
Thank you for your help!
4 posts - 3 participants
]]>We’re excited to announce that the Frame.io Python SDK (frameio) now includes built-in OAuth 2.0 authentication. No more managing tokens manually or dealing with 401 errors anymore— the SDK handles the full lifecycle for you.
The new frameio.auth module supports three OAuth 2.0 flows:
| Flow | Best For |
|---|---|
| Server-to-Server | Backend services, scripts, automation — no user interaction needed |
| Web App | Server-side apps (Flask, Django, FastAPI) where users sign in |
| SPA (PKCE) | Browser apps, CLIs, or anything that can't store a client secret |
Every flow has both sync and async variants, so it works whether you’re building a simple script or an async web service.
pip install frameio --upgrade
Head to the Adobe Developer Console and create a project with Frame.io API access. You’ll need:
Client ID (all flows)
Client Secret (Server-to-Server and Web App)
Redirect URI (Web App and SPA — must be registered in your Adobe project)
Server-to-Server (simplest — great for scripts and backend services):
from frameio import Frameio
from frameio.auth import ServerToServerAuth
auth = ServerToServerAuth(
client_id="YOUR_CLIENT_ID",
client_secret="YOUR_CLIENT_SECRET",
)
client = Frameio(token=auth.get_token)
# That's it. Tokens refresh automatically.
me = client.users.me()
print(f"Authenticated as {me.name}")
Web App (for apps where users sign in):
import secrets
from frameio import Frameio
from frameio.auth import WebAppAuth
auth = WebAppAuth(
client_id="YOUR_CLIENT_ID",
client_secret="YOUR_CLIENT_SECRET",
redirect_uri="https://yourapp.com/callback",
)
# Step 1: Redirect user to Adobe sign-in
url = auth.get_authorization_url(state=secrets.token_urlsafe(32))
# Step 2: In your callback handler, exchange the code
auth.exchange_code(code=request.args["code"])
# Step 3: Use the client
client = Frameio(token=auth.get_token)
SPA / PKCE (for apps that can’t store a secret):
import secrets
from frameio import Frameio
from frameio.auth import SPAAuth
auth = SPAAuth(
client_id="YOUR_CLIENT_ID",
redirect_uri="https://yourapp.com/callback",
)
result = auth.get_authorization_url(state=secrets.token_urlsafe(32))
# Redirect user to result.url, store result.code_verifier
# In your callback:
auth.exchange_code(code="CODE_FROM_CALLBACK", code_verifier=result.code_verifier)
client = Frameio(token=auth.get_token)
Automatic token refresh — tokens are refreshed transparently before they expire
Token persistence — export_tokens() and import_tokens() let you save and restore tokens across app restarts
Token revocation — auth.revoke() invalidates tokens with Adobe IMS
Async support — every flow has an async variant (AsyncServerToServerAuth, AsyncWebAppAuth, AsyncSPAAuth)
Thread-safe — multiple threads can call get_token() concurrently; only one refresh happens at a time
The module includes specific exceptions so you can handle failures precisely:
from frameio.auth import AuthenticationError, TokenExpiredError
try:
client = Frameio(token=auth.get_token)
assets = client.files.list(project_id="...")
except TokenExpiredError:
# Refresh token expired — redirect user to sign in again
pass
except AuthenticationError as e:
print(f"Auth failed: {e.error_code} — {e.error_description}")
Python Authentication Guide — full walkthrough with Flask examples
SDK Reference — API reference for all auth classes (to be updated very soon)
We’d love to hear how it works for you. If you run into issues or have feature requests reply to this post!
4 posts - 2 participants
]]>Short summary: It seems the new Frame.io API does not provide a way to retrieve assets associated with a shared link.
We’ve run into a blocker while integrating with the new Frame.io API. From what we can see:
We can fetch shared links via the API
We can fetch assets independently
We can fetch comments for specific assets
However, there is no way to determine which assets belong to a given shared link.
Because of this, we’re unable to retrieve comments for assets that were accessed via shared links, since we can’t resolve the asset list behind a link.
Frame.io support confirmed that (as of Jan 2026) this functionality is not available, but suggested checking here in case there’s:
A workaround we might be missing
An undocumented endpoint or approach
Any updates or roadmap plans for this
Has anyone solved this or found a reliable workaround?
Thanks in advance ![]()
4 posts - 3 participants
]]>def frameCrateFolder(frameProject,frameNewFolder):
from frameioclient import FrameioClient
TOKEN=("xxxxxxx")
client = FrameioClient(TOKEN)
# Create a folder:
asset = client.assets.create(parent_asset_id=frameProject,,name=frameNewFolder,type="folder")
return asset
def uploadToFrame(destination_id,fileToUpload):
from frameioclient import FrameioClient
TOKEN=("xxxx")
client = FrameioClient(TOKEN)
upload=client.assets.upload(destination_id, fileToUpload)
return upload
4 posts - 3 participants
]]>
Endpoint URL: https://api.frame.io/v4/accounts/:account_id/comments/:comment_id
Sample Response:
{
"data": {
"id": "a0f691cb-f9a2-4432-9616-911be085fa3e",
"timestamp": 0,
"text": "\r\n#FAST_SEG_1",
"updated_at": "2026-03-23T13:33:50.568130Z",
"annotation": None,
"page": None,
"completed_at": None,
"created_at": "2026-03-23T11:13:28.351145Z",
"file_id": "83ef1519-f3e1-4ed6-a3de-f8f2d97dbcbc",
"completer_id": None,
"text_edited_at": None
}
}
The GraphQL API that the UI is using does however include this field:
{
"data": {
"comment": {
"id": "a0f691cb-f9a2-4432-9616-911be085fa3e",
"annotation": null,
"bounds": null,
"isCopy": false,
"documentPageNumber": null,
"duration": 483.142299,
"timestampMicroseconds": 0,
"textReviewAnnotation": null,
"viewerContext": null,
"__typename": "Comment"
}
}
}
3 posts - 2 participants
]]>I’m trying to set up a fresh Frame.io API integration using Adobe IMS OAuth and I’m consistently getting blocked at the API layer even though the OAuth flow itself is working.
What’s working
Created a fresh Adobe Developer Console project
Added the Frame.io API
Configured OAuth Web App credentials
Used Authorization Code flow (not server-to-server)
Requested scopes:
• openid
• additional_info.roles
• offline_access
• profile
User successfully approves the app
Token exchange succeeds
Access + refresh tokens are issued successfully
What’s failing
All Frame.io API calls return 403 Forbidden, including:
GET /v2/me
GET /v4/me
GET /v4/accounts
GET /v4/teams
GET /v2/teams
GET /v4/assets
So this does not appear to be just a /me endpoint issue.
Additional notes
This was tested with a brand new Adobe app/client
Old local tokens/config were deleted before retrying
The access token decodes correctly and includes:
• openid, additional_info.roles, offline_access, profile, email, AdobeID
OAuth flow and token issuance are both successful
The same token fails across both v2 and v4 API endpoints
Question
Does this indicate that my Frame.io user/workspace is not fully linked or entitled for API access on the backend, even if Adobe login appears to be working in the UI?
If so, what exact account/workspace state should I verify, or what needs to be enabled on your side?
Thanks — trying to determine whether this is still a configuration issue on my end, or whether the account linkage / API entitlement needs support intervention.
12 posts - 3 participants
]]>I’m uploading files to a folder in my project, creating a share with the same name as the folder, and then adding each uploaded asset to the share. This works great, unless I have more than 10 assets in the share. The add new asset to share rate limit is 10 per 1 minute, so i’m pretty consistently getting 429 errors when trying to add the newly uploaded assets to the new share.
I know that I could add the entire folder to the share, but this isn’t really how I’d like to work, as sometimes our clients want us to remove items from the share, and then re-add them later. Having each asset added to the share lets us modify the share, and keep the assets in our workspace / project.
Would you consider increasing the Rate Limits on this API call to something more like 5 calls per second?
2 posts - 2 participants
]]>I have recently linked one of my frame.io accounts to Adobe.
I wanted to begin migrating to V4 API but I cannot find S2S type authentication in Adobe Developer Console, despite having administrative access. The app implementation would be without frontend interfaces, hence the S2S requirement.
Is it possible to gain access to S2S type authentication?
4 posts - 2 participants
]]>I’d like to also mark the comments as ‘completed’ after they are successfully imported. This worked well during my testing phase, on comments I made myself, but updating a comment left by a real world other frame.io user (on an asset in my workspace) fails with a 403 - Forbidden error.
I can mark the comment as completed in the browser logged in with the same credentials as I am when receiving the error in the API.
7 posts - 2 participants
]]>I think I’m ready to move over.
Has anyone had any problems updating their existing legacy account to v4?
Is that an ok workflow or is it recommended to create a new account from scratch? (This would be doable for me but quite annoying, as ongoing projects would mean straddling 2 accounts for some time).
Do existing share links/review links persist ok, including settings like downloads being enabled? Anything else to watch for?
3 posts - 2 participants
]]>14 posts - 2 participants
]]>[email protected]/me returns joined_via: collaborator and highest_account_role: nullIt seems like there’s some account setting that’s missing/wrong, I’m just out of ideas where to look, any help will be appreciated, thanks!!
2 posts - 2 participants
]]>15 posts - 3 participants
]]>I’m working on automating asset ingestion for a project in Frame.io V4 and need to reliably traverse the folder hierarchy.
I can successfully retrieve users for the account using the API, but all attempts to access the project’s root folder or list folders/assets fail with Not Found.
Specifically:
GET /v4/accounts/<account_id>/workspaces/<workspace_id>/projects/<project_id>/root_folder
GET /v4/accounts/<account_id>/workspaces/<workspace_id>/projects/<project_id>/folders
both return no route found.
My questions:
What is the correct API endpoint to retrieve the root folder ID of a project?
Once I have the root folder ID, is the /folders/<folder_id>/children endpoint the proper method to recursively traverse folders and list assets?
Are there any versioning or header requirements (e.g., x-api-key, api-version) I need to ensure traversal works consistently?
Thanks.
2 posts - 2 participants
]]>I realize you can just navigate directly on the page if you’re logged in, so this isn’t super necessary, but my users are used to running a macro for this action on our previous solution so it’s a nice to have.
5 posts - 3 participants
]]>mimetypes.guess_type() returns and what signed header expects for the .
For example, wav files report audio/x-wav and .ogg files report audio/ogg i figured out that the frame.io server is expecting audio/wav and that i had to use application/octet-stream instead of audio/ogg
Is there a list of supported content types, or an easier way for me to determine them on my own?
5 posts - 2 participants
]]>However FrameioClient.Options does not have a fetcher option:
FrameioClient {
interface Options {
environment?: core.Supplier<environments.FrameioEnvironment | string>;
/** Specify a custom URL to connect the client to. */
baseUrl?: core.Supplier<string>;
token: core.Supplier<core.BearerToken>;
/** Additional headers to include in requests. */
headers?: Record<string, string | core.Supplier<string | null | undefined> | null | undefined>;
}
}
This is in [email protected]
2 posts - 2 participants
]]>We rely heavily on the Frameio API and webhooks to automate our entire video production pipeline. Our ingest, review, version management, notifications, and downstream processing are all built around the current API structure. This is not a light integration for us. It is mission critical infrastructure.
We have intentionally held off upgrading to V4 because of widespread negative public sentiment surrounding the new platform, particularly regarding:
Lack of API feature parity with Legacy
Incomplete or missing endpoints
Limitations around version stacking
Changes to webhook behaviour
Instability and inconsistencies reported by developers
Missing workflow-critical functionality
This research document compiles public discussions from forums, developer channels, and user communities. The dominant pattern is consistent concern from power users and developers that the V4 API is not yet complete enough to replace Legacy in production environments.
For us, the limited version stacking capabilities alone are a deal breaker. Our workflow depends on predictable, controllable version management. Without this, our automation breaks.
A forced migration under these conditions effectively bricks our production pipeline. It is not a minor adjustment. It requires a full architectural rewrite of our automation stack, while core features are still reportedly missing.
This creates significant operational risk for teams that have built serious infrastructure on top of the Legacy API.
We are asking:
Is full API parity with Legacy guaranteed before migration?
Will version stacking functionality be restored to a level comparable to Legacy?
Is there an option to delay migration for API-heavy enterprise workflows?
Can Adobe provide a clear feature parity roadmap with timelines?
We understand platforms evolve. But forcing migration before parity is reached puts developer-driven workflows in a precarious position.
We are attaching the research summary for transparency and would appreciate direct clarification from the product and API teams
If other developers are in the same position, we would welcome hearing how you are handling this transition.
7 posts - 2 participants
]]>