Ocoya
Developer

Publish to anything you own.

A Custom destination is a network Ocoya does not have to know about. Give it a URL and it receives your finished content as JSON — the same way a post goes to Instagram, except the other end is yours.

POST https://yoursite.com/api/posts 200 OK
Your post
Your endpoint
Your blogYour CMSA Zapier catch hookAn internal queue
What it is for

The destination for everything else.

Most of what people publish goes to a network with a logo. This is for the rest of it.

Your own blog

Articles written in Ocoya land in whatever CMS you already run — Ghost, Strapi, Sanity, something you built.

A network we do not support

Catch the post and forward it yourself. Anything with an API can be reached from your own code.

An approval step of your own

Route published content into a review queue, a Slack channel or a spreadsheet before it goes anywhere else.

Your own records

Keep a copy of everything published, in your warehouse, without polling an API for it.

Connecting it

A URL, a name, and usually one header.

There is no OAuth dance, because you own both ends. Paste the address, add the header your endpoint authenticates with, and it shows up in the composer beside your social profiles.

  • Any URL that accepts a POST and answers 2xx
  • Headers for whatever your endpoint authenticates with
  • Appears in the composer like any other profile

Connect a custom destination

Name

My blog

Webhook URL

https://yoursite.com/api/posts

Advanced options

Authorization
Bearer ••••••••
Connect destination
Step by step

Four steps, and none of them is a developer week.

01

Have somewhere to receive it

Any URL that accepts a POST with a JSON body and answers 2xx. It has to be reachable from the internet — Ocoya dials it from our side, not from your browser.

02

Add the destination

Integrations → Custom. Give it a name you will recognise in the composer, and paste the URL.

03

Add a header, if it needs one

Under Advanced options, add the header your endpoint authenticates with — usually Authorization or X-API-Key. It is stored encrypted and never shown back to the browser.

04

Publish to it like a network

It appears in the composer beside your social profiles. Schedule a post, or point a blog campaign at it, and it receives everything the composer stored.

The payload

One POST, with everything the composer stored.

The body is JSON. The caption arrives exactly as authored — Markdown if it is an article — and everything else the composer kept rides along under options, so a field added later needs no change at your end.

  • Content-Type: application/json, plus any headers you added
  • caption is the body as written; title and media are separate
  • options carries slug, excerpt, tags and SEO fields

Answer with a 2xx and Ocoya marks the post published. Anything else is shown to you with the body your endpoint returned.

request body
{
"event": "post.published",
"publishedAt": "2026-09-22T09:00:00.000Z",
"profile": { "id": "…", "name": "My blog" },
"post": {
"id": "…",
"title": "Why your content is not converting",
"caption": "## The three pillars\n\n…",
"media": [ { "url": "…", "alt": "…" } ],
"options": { "slug": "…", "excerpt": "…", "tags": […] }
}
}

Every field, with its type

The slug, excerpt, SEO fields, tags and reading time an article carries — what each one is, and which of them a social post leaves out.

Read the payload reference
Safety

It is your endpoint, dialled carefully.

A destination is an address we connect to from our own network, so it gets treated like one.

Private and internal addresses are refused, and the connection is pinned to the address it resolved to.

A redirect is followed only after the new address passes the same check.

Your headers are stored encrypted and never serialised back to the browser.

Whatever your endpoint answers is shown in the activity log, body and all.

Publish it wherever it belongs.

Connect a destination in a minute and point your next campaign at it.