If you have looked for the Instagram node and not found it, you are not going mad: it does not exist, at least not the one you need. Here is what is actually possible, what is not, and the way that works.
The short answer. n8n cannot publish to Instagram on a schedule on its own. The Instagram node it ships is a trigger (it reacts to comments, mentions and expiring stories); the Facebook Graph API node can post, but you have to build Meta's two-step container flow yourself, and Instagram's API publishes the moment you call it: it has no "post this at 6pm tomorrow" parameter.
So scheduling has to happen somewhere that stays awake. Either you keep an n8n instance running 24/7 and drive Meta's API by hand, or you hand the post to a service that holds it and publishes it for you. This page shows the second way, with Rubinyun: one HTTP node, and the post goes out at the right time even with n8n and your computer off.
Three facts, worth knowing before you spend an evening on it:
graph.facebook.com, so technically you can publish. In practice you build Meta's two-step flow yourself (create a media container, then media_publish), host the media at a public URL Instagram can fetch, manage the Page token and the Instagram business ID, and handle the async processing of video. It is a project, not a node. (n8n docs)And n8n has no notion of a good time to post: whatever hour you type into the cron is the hour you get.
Split the job in two. n8n does what it is good at (build the content, fetch the image, write the caption, call an API) and a scheduler holds the post and publishes it at the right moment from a server that never sleeps. Your workflow finishes in a second and can go back to sleep with your laptop.
With Rubinyun that is two HTTP calls: one to ask when to post, one to queue the post. Both authenticated with a key and a secret sent as headers.
Create an account (10 posts a month are free) and open API Keys: you get a key and a secret. The secret is shown once, so copy it then.
Send them as headers, not in the URL: query strings end up in server logs and browser history.
# the two headers every call needs X-WS-Key: rby_live_… X-WS-Secret: rby_sk_…
You connect Instagram by pasting a Meta Page token, following a guided page that walks you through Meta's screens. Let us be straight about it: this is the least pleasant part of the current version, and one-click OAuth is planned but not there yet. You also need an Instagram business or creator account, which is Instagram's rule, not ours.
Once connected, you never touch it again: the token is stored server-side and used for every publish.
This is the part n8n cannot do at all. Rubinyun computes the best posting time by analysing the profile's own history, not generic averages: it reads your account's recent posts through the Instagram Graph API, measures the engagement they got by weekday and by hour, and returns the hour that historically worked best on that weekday for your audience.
curl "https://www.chrononyte.com/rubinyun/api.php?action=besttime&when=today" \ -H "X-WS-Key: rby_live_…" -H "X-WS-Secret: rby_sk_…" # -> {"ok":true,"slot":{"at":"2026-07-15 18:00","hour":18,"weekday":"Wednesday", # "why":"engagement by weekday and hour (your own posts)","sample":42}}
Two ways to use it, and the difference matters:
when=today): you get the soonest good moment, day and hour.when=2026-07-17&keep_day=1): your day is kept and only the hour is chosen, from the best slot still ahead on that day. Without keep_day the answer would roll to the next day if that day's best hour had already passed, silently moving a date you picked.In n8n, take {{ $json.slot.at }} from this node and feed it to the next one.
One POST, and you are done. The media must be at a public URL (Instagram downloads it itself); if you do not have one, Rubinyun's upload.php gives you one.
curl -X POST "https://www.chrononyte.com/rubinyun/api.php?action=add" \ -H "X-WS-Key: rby_live_…" -H "X-WS-Secret: rby_sk_…" \ -d type=image \ -d image_url="https://yoursite.com/photo.jpg" \ -d caption="Posted from my n8n workflow" \ -d scheduled_at="2026-07-15 18:00"
From here on it is not your problem any more. The engine on the server checks the queue every few minutes and publishes what is due, with n8n stopped, your laptop closed and you asleep. A token is charged only if the post actually publishes: if Instagram rejects it, you are not charged.
Formats: single image, carousel (2 to 10 images), reel (mp4/mov) and story. Video is processed asynchronously by Instagram, and Rubinyun waits for it before publishing.
The two nodes above, already wired: import it, point the nodes at a Header Auth credential (name Authorization, value Key YOUR_KEY:YOUR_SECRET), then set the image URL and the caption.
It works the same from Make, Zapier or a shell script: it is plain HTTP.
10 posts a month are free. After that you buy tokens instead of a subscription: €5 for 25 posts (about €0.20 each), €10 for 60, €25 for 180, and they never expire. If you post constantly there is a €9/month plan for 150 posts, or €19/month unlimited. Prices include VAT.
One post costs one token, whether it is a single photo or a ten-slide carousel. And again: charged only on a successful publish.
Rubinyun publishes to Instagram only. If you need TikTok, LinkedIn or X today, it will not be enough for you, and I would rather say so than take your money. There is an honest comparison with the alternatives here, including the things they do better.
Not a market opportunity. A stupid, specific problem of mine.
My own automations needed to publish to Instagram, which is the channel I actually use. They could not: Business Suite will not schedule for you through an API, Instagram's API publishes the instant you call it, and it will not even take a file: it wants a public URL to download the media from. So the posts sat ready in a folder on my laptop, and I was the one at the keyboard at six in the evening pressing publish, because that is when my audience is there. For months I was the cron job.
The advice I got was to subscribe to a scheduler. Then I looked at what I already had (a Linux domain, PHP, a server that is awake at six in the evening whether I am or not) and thought: how hard can the boring part be? Something that takes the file, gives it a URL, holds it, and calls Meta at the right minute.
Two days and it was up, publishing my carousels on its own. It took three more to turn that into something another person could use: tokens instead of a subscription, keys, the queue, the n8n side. That is the whole timeline, and the first version had no console, no accounts and no payments: it existed to publish my posts while my laptop was shut.
The honest state of it today: connecting Instagram still means pasting a Meta token by hand, following a guided page, because a proper one-click connection needs Meta's app review and I have not done it yet. It is the least pleasant thing here, I know it, and it is next on the list. If something on this page is wrong or out of date, write to me and I will fix it.