Great question! Gamma works a bit differently than PowerPoint - instead of draggable text boxes, it uses a block-based system with Smart Layouts. For positioning text on specific sides of a card: Click the Insert menu on the right side of your screen
Select Smart Layouts
Choose a column-based layout that fits what you need (left/right splits, multi-column, etc.)
You can also adjust text alignment within any block - just highlight your text and choose left, center, or right alignment from the formatting menu. About the table issue with AI generation: This is a known limitation. When AI generates content, it doesn't always preserve table formatting perfectly, especially on cards with colored backgrounds or complex styling. Here's what I'd suggest:
Use columns instead of tables - Smart Layouts with columns often display more reliably than tables
Edit after generation - Let AI create the content, then click on the layout and switch to a different one. Gamma will automatically adjust your content to fit
Try "Try new layout" - Click the sparkle icon on any card and select "Try new layout" to have AI suggest alternatives that might work better
Here's more info on layouts and styling: Smart Layouts: https://help.gamma.app/en/articles/11029130-what-s-the-fastest-way-to-transform-content-and-layouts Card styling: https://help.gamma.app/en/articles/11969695-how-do-i-style-cards-and-adjust-layout-settings-in-my-gamma Text formatting: https://help.gamma.app/en/articles/11028318-how-do-i-add-edit-and-style-text-in-gamma Let me know if you have other questions! If you are continuing to have issues please send a video so we can look into this further.
Hey Dan! I dug into this a bit more – unfortunately, the /v1.0/themes endpoint doesn't currently support filtering by type directly. The available parameters are:
query – name search
limit – max 50 results
after – pagination cursor
Workaround: Each theme in the response includes a type field ("custom" or "standard"), so you can filter client-side: javascript
const customThemes = response.data.filter(theme => theme.type === 'custom');If you have a lot of themes, you may need to paginate through results, but this approach lets you identify which are yours. Building out the full implementation is a bit outside our support scope, but hopefully that points you in the right direction! If you'd like to see a native type filter added to the endpoint, definitely drop it in Ideas & Requests in the community Slack or on our Canny board – that's where feature requests get tracked and prioritized! 🙏
Hey Juan Diego! 👋 That CORS error is a browser security feature that blocks frontend JavaScript from making direct API calls to different domains. This is expected behavior and not specific to Gamma. Gamma-specific things to verify:
API key starts with sk-gamma-
Using X-API-KEY header (not Authorization or Bearer)
For v1.0, both inputText and textMode are required
Example request body: json
{
"inputText": "Your content here",
"textMode": "generate",
"format": "presentation",
"numCards": 10
}How your application is structured to call our API falls outside what we can help with. We focus on Gamma-specific configuration, authentication, error messages, and rate limits rather than custom application architecture. Once requests are reaching us from a server environment, if you hit any Gamma-specific errors, share the x-request-id from the response headers and I can help debug from there. Full docs: https://developers.gamma.app
Hey! 👋 Good news - those models are available via API. Here are the exact strings: Nano Banana:
gemini-2.5-flash-image (Nano Banana Flash) - 20 credits
gemini-3-pro-image (Nano Banana Pro) - 10 credits
gemini-3-pro-image-hd (Nano Banana Pro HD) - 30 credits, Ultra only
Flux 2:
flux-2-pro (Flux 2 Pro) - 4 credits
flux-2-flex (Flux 2 Flex) - 10 credits
The docs page you linked hasn't been updated.
Hi John! 👋 Glad you're loving spotlight mode! Quick answers on your questions: Audio per slide: We don't have native MP3 upload at the moment. The workaround is embedding audio from services like Spotify or SoundCloud. Just paste the link directly or use /spotify and Gamma will create a playable embed right in your card. Video recording: Gamma doesn't have built-in recording. Most folks pair Gamma with tools like Loom, OBS, or Zoom to record themselves presenting, then share that recording. Video uploading: You can embed videos from YouTube, Vimeo, Loom, and similar platforms. Just paste the link into your gamma or use the Videos & media option in the insert menu. 💡 Tip: If you're looking to add voiceover, recording with Loom while presenting your Gamma in spotlight mode works really well. You get the polished presentation experience plus your narration. Native audio per slide is solid feedback. I'd encourage you to drop it in Canny so it gets on the radar: https://meetgamma.canny.io/ What's the use case you're going for? Happy to brainstorm other approaches!
Hey Dan! 👋 Webhooks/callbacks are definitely on the team's radar - appreciate you raising it, this kind of feedback helps shape what gets prioritized. For now polling is the way to go. Our docs recommend waiting at least 5 seconds between status checks on the GET /v1.0/generations/{id} endpoint. A few things that might help:
Most generations need 30-90 seconds depending on complexity, so you can delay your first poll a bit
The pending → completed (or failed) status pattern is reliable
Backing off gradually for longer generations can save you some cycles
Full details in the API reference: https://developers.gamma.app Let us know if you run into anything weird with your current setup, happy to help troubleshoot! 🙌
Hey Don! Yep, Gemini Image Pro is ready to go in the API. Here are the model strings:
gemini-2.5-flash-image → standard Gemini/Nano Banana, fast
gemini-3-pro-image → Gemini Pro (2K resolution)
gemini-3-pro-image-hd → Ultra only (4K resolution)
Usage looks like this: json
"imageOptions": {
"source": "aiGenerated",
"model": "gemini-3-pro-image"
}Quick note: if you hit a "Model not available on plan" error, it just means that specific model requires a higher workspace tier. The docs at developers.gamma.app might be a bit behind on listing all the newest models, but they should work if you pass them in directly. Let me know if you run into any issues!
Hey! Good question. Currently the API doesn't support file uploads directly. The inputText parameter takes text content (and you can embed image URLs inline), but there's no way to pass files like PDFs or docs and have Gamma extract the content. The workaround for now is to extract the text from your files first, whether that's via OCR, a parsing tool, or just copy/paste, and then pass that into inputText. That said, this is solid feedback! If you haven't already, drop it in Ideas & Requests or on our Canny board. The product team reviews those regularly and it helps them prioritize what to build next. 🙌
Can't speak to it specifically but I would recommend making it a suggestion on our Canny or the feedback page on the API Documentation.
Hey Dan I dug into this more: Unfortunately, this isn't currently supported either. While you can use format: "webpage" to generate content intended for a site, the actual publishing step (making it live at a *.gamma.site URL) still requires going through the web UI. So the current workflow would be:
Generate via API with format: "webpage"
Open the returned gammaUrl in Gamma
Publish manually from there
I know that's not the seamless automation you're looking for. If programmatic publishing is important for your use case, I'd encourage you to drop that feedback in #feature-requests or the feedback form - it helps the team prioritize what to build next. Let me know if you have other questions!
