Using UGC API from n8n and Make
You don't need to write code to post UGC through an API. n8n and Make both have HTTP request steps that can call UGC API directly. This guide sets up a sheet-to-post flow and a results webhook in each.
Updated
What you need
- A UGC API key from the dashboard. It starts with
ugc_live_. - Connected account IDs. Create connect links from the dashboard or with one HTTP call, then copy the
acc_...IDs fromGET /v1/accounts. - Media on public URLs, like a public storage bucket or the URLs returned by
POST /v1/media.
The one request you need
Every flow below ends in this request. Method POST, URL https://ugcapi.dev/v1/posts, two headers, and a JSON body.
| Setting | Value |
|---|---|
| Method | POST |
| URL | https://ugcapi.dev/v1/posts |
| Header | Authorization: Bearer ugc_live_... |
| Header | Content-Type: application/json |
| Body | JSON: accounts, format, media, caption, scheduled_at, options |
n8n: Google Sheet to scheduled posts
- Make a sheet with columns:
account_id,format,media_url,caption,scheduled_at,status. - Add a Schedule Trigger to run every 15 minutes, or a Google Sheets Trigger on new rows.
- Add a Google Sheets node to read rows where
statusis empty. - Add an HTTP Request node. Set method POST and the URL above. For auth, create a Header Auth credential with name
Authorizationand valueBearer ugc_live_..., so the key isn't stored in the workflow. - Set body content type to JSON and map fields from the sheet row.
- Add a Google Sheets update node to write the returned post
idintostatus.
{
"accounts": ["{{ $json.account_id }}"],
"format": "{{ $json.format }}",
"media": ["{{ $json.media_url }}"],
"caption": "{{ $json.caption }}",
"scheduled_at": "{{ $json.scheduled_at }}"
}For slideshows, put the image URLs in one cell separated by commas and use an expression to split them into the media array.
Make: the same flow
- Start with Google Sheets > Watch Rows.
- Add HTTP > Make a request.
- Set URL, method POST, and add the two headers. Keep the API key in a connection or a variable rather than typing it into every module.
- Set body type to Raw, content type JSON, and build the JSON with mapped values.
- Turn on Parse response so you can map
idinto a Google Sheets > Update a Row module.
Spreading a batch with campaigns
If you have 50 rows and 5 accounts, don't send 50 posts at fixed times. Collect the rows with an aggregator (n8n's Aggregate node, Make's Array aggregator) and send one POST /v1/campaigns with a per-account cadence. We assign and stagger them. See campaigns.
Getting results back
- In n8n, add a Webhook node and copy its production URL. In Make, add Webhooks > Custom webhook.
- Register it once with
PUT /v1/webhookand body{ "url": "..." }. - Branch on the event type:
post.publishedwrites the URL to the sheet,post.failedwrites the error message.
To verify signatures in n8n, use a Crypto node to compute the HMAC-SHA256 hex of the raw body with your secret and compare it with the X-UGCAPI-Signature header. Details are in webhooks.
Common mistakes
- Sending
mediaas a string instead of an array. - Dates without a timezone. Use ISO 8601 with Z, like
2026-11-01T17:00:00Z. - Private media links, like Google Drive share pages. Platforms need a direct file URL.
- Missing
Bearerbefore the key.
Error responses follow one JSON shape, listed in errors. Brands running this setup should also see ecommerce brands.
Keeping costs predictable
Automations can loop. Before you turn a flow on, run it on one row and check GET /v1/usage for credits left. Add a filter so rows with a post ID are never sent again. Each post to one account is one credit, and you start with 50 free, so a test run costs nothing. Credits never expire, so there's no pressure to use them up in a month.
FAQ
Is there an n8n or Make app for UGC API?
Not a dedicated one. The built-in HTTP request steps work with any REST API, including ours.
Can I use Google Drive links for media?
Not share-page links. Platforms need a direct, public file URL. Upload to POST /v1/media or use public storage.
Can Zapier do this too?
Yes, with its webhook action that sends a custom POST request with headers and a JSON body.
How do I post slideshows from a sheet?
Put image URLs in one cell, split them into an array with an expression, and set format to slideshow.