> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ocoya.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Framer

> Connect a Framer project with an API key, how an article becomes a Framer CMS item, what publishing live does to your site, and starting a workflow from a new item.

<Note>
  Framer is in **beta** in Ocoya. It is built on Framer's Server API, which Framer itself still calls beta, so things may change as Framer changes it.
</Note>

A Framer channel is one **CMS collection** in one Framer project — your *Blog*, a *Journal*, *Case Studies*. Post to it and Ocoya adds a new item: the title, the formatted content, the cover image and the date filled in. Then, unless you chose to keep it as a draft, Ocoya publishes the site.

Framer can also start a workflow: a new item in a collection can be shared to your other channels. See [Framer in workflows](#framer-in-workflows) below.

## Before you start

Framer has no sign-in for apps. Instead, Ocoya uses Framer's **Server API**, which is opened with an **API key** made in the project's own settings. A key reaches that one project only — to connect three Framer sites, connect each with its own key.

You need to be able to open the project's **Site Settings**. Framer's Server API is in beta.

## Connect Framer

<Steps>
  <Step title="Create an API key in Framer">
    Open the project in Framer, then **Settings** → **General**. Under **API keys**, click **Add**, and copy the key.
  </Step>

  <Step title="Copy the project's address">
    With the project open, copy the address from your browser. It starts with `https://framer.com/projects/`.
  </Step>

  <Step title="Choose Framer in Ocoya">
    Select **Channels** in the left sidebar, then **Connect channel**, and pick **Framer** under Blogging.
  </Step>

  <Step title="Paste the address and the key">
    Paste them into **Project address** and **Framer API key**, then select **Connect Framer**. Ocoya opens the project straight away to check the key works.
  </Step>

  <Step title="Select the collections to add">
    Every collection in the project is listed, named *Project name · Each post becomes an item*. Choose the ones you want as channels for this brand. If there is only one, it's added without asking.
  </Step>
</Steps>

<Note>
  A collection that a Framer plugin keeps in sync — from Google Sheets or Notion, say — is listed but can't be picked: *A plugin manages this collection, so posts cannot be added to it*. Framer only lets that plugin write to it.
</Note>

To replace the key, connect Framer again with the same project address and the new key. Your channels keep working.

## How posts appear

| Part of your post | Where it goes in Framer |
| - | - |
| Title | The field the collection's slug is based on — usually **Title** — up to 256 characters. With no title, the first line of your text is used |
| Title | The **Slug**, in lowercase letters, numbers and hyphens. A slug already used in the collection gets `-2`, `-3` and so on |
| Text | A **Formatted Text** field named *Content*, *Body* or similar — otherwise the first Formatted Text field |
| First image | An **Image** field named *Image*, *Cover*, *Thumbnail* or similar — otherwise the first Image field. Only the first image is used |
| Summary | A text field named *Summary*, *Excerpt* or *Subtitle* gets the article's excerpt, or the first 160 characters of the text |
| Date | A **Date** field named *Date*, *Published* or similar is set to the moment it was posted |

If the text's first line repeats the title, it's left out of the body. Links you added to the post that aren't already in the text go at the end. Markdown — headings, lists, quotes, bold, links — arrives as real formatted text, and image alt text is passed to Framer, which keeps its own copy of the image.

Every other field is left alone.

## What publishing live does

Posts from the post editor are **published live**: Ocoya adds the item, then publishes the project and deploys it to your custom domain.

<Warning>
  Framer publishes a project as a whole. **Any other unpublished changes in the project go live with the article** — a half-finished page, a redesign in progress. If somebody is working on the site, use a workflow with **Keep as draft** instead.
</Warning>

If Framer is briefly unavailable, Ocoya tries again a few times over the next minute. If it still can't publish, the new item is taken out again and the post fails, so a failed post never leaves a stray item in your collection.

In a workflow, the **Publish to Framer** step lets you choose under **In Framer**:

| Setting | What happens |
| - | - |
| **Publish live** (default) | The item is added and the site is published |
| **Keep as draft** | The item is added as a draft. Framer leaves drafts out of every publish until somebody changes it |

This is separate from the step's **Save as draft** switch, which keeps the post in your Ocoya planner without sending it to Framer at all.

A published post links to its page on your site, using the path of the collection's CMS page in Framer, such as `/blog/your-post`. If no page shows the collection, or the item is a draft, it links to the item in Framer instead.

You don't need Framer open for any of this. Ocoya talks to Framer's servers directly.

## What you can post

| Post type | Supported |
| - | - |
| Text | Yes |
| Images | Yes — the first becomes the cover. Framer collections hold one image per Image field |
| GIF | Yes, as an image |
| Video | No |

A post needs text or an image.

## Framer's limits

| | Limit |
| - | - |
| Post text | 100,000 characters |
| Title | 256 characters |
| Images | 1 used per post |
| Hashtags | No limit. Framer shows them as plain text |

## Deleting a post

Deleting a published post in Ocoya removes the item from the collection. **Ocoya doesn't publish the site when you delete**, so nobody's unfinished work goes live because of it — the item leaves your live site the next time the project is published. Items your team created are never touched.

## Framer in workflows

Framer works at both ends of a workflow.

**Publish to Framer** is an action. Choose the collection, a **Title** (its slug is made from it), the caption, and **In Framer**: Publish live or Keep as draft.

**New item in a Framer collection** is a trigger. Choose a collection channel, and the workflow runs once for each new item.

| Setting | What it does |
| - | - |
| **Collection** | The collection to watch. It has to be connected as a channel first |
| **Only when** | Optional. A field name and a value, such as *Category* and *News*. The workflow then runs when an item reaches that value — drafts included — instead of when it's added |

How the trigger behaves:

* **Ocoya checks every 15 minutes.** Framer doesn't notify apps of changes, so a new item can take up to 15 minutes to start its run.
* **Drafts are skipped.** Without **Only when**, an item runs once it's in the collection and not a draft.
* **Nothing before you switch the workflow on counts.** Items already in the collection are left alone, and an item counts from when it was created.
* **Each item runs once.** Editing it later doesn't post it again.
* **Up to 10 items run per check**, oldest first.

Every field of the item is available to the steps after the trigger, written in lowercase with underscores: a field called *Cover Image* becomes `{{trigger.cover_image}}`. You can also use:

| Value | What it holds |
| - | - |
| `{{trigger.title}}` | The title field, otherwise the slug |
| `{{trigger.url}}` | The item's page on your site. Empty for a draft, or when no page shows the collection |
| `{{trigger.text}}` | The summary field, otherwise the content as plain text, otherwise the title |
| `{{trigger.image}}` | The first image. `{{trigger.images}}` holds them all |

Formatted text arrives as plain text, options as their names, and references as item IDs. Leave a following **Post to** step's caption or media empty and it uses `{{trigger.text}}` and the item's images.

## Disconnecting

Disconnecting a Framer channel in Ocoya stops Ocoya posting there. Items it already added stay in your collection.

To cut Ocoya's access entirely, delete its API key in the project's **Site Settings** → **General**. Every Framer channel from that project then shows **Reconnect needed** the next time it posts.

## Common problems

**"Framer no longer accepts this API key."** The key was deleted, or it belongs to another project. Create a new key in the project's Site Settings and connect Framer again with it.

**"Paste the project's address from your browser…"** The project address must start with `https://framer.com/projects/`. Copy it from the browser's address bar with the project open.

**"Framer would not publish the site (…), so the item was not added."** Framer refused to publish even after Ocoya tried again. Nothing was left behind in the collection. Try again later.

**"A plugin manages the Framer collection …"** That collection is synced by a plugin. Post to a collection you manage yourself.

**"The Framer collection … has no formatted text field for the post."** Add a Formatted Text field to the collection in Framer.

**"Framer is busy" / "Framer took too long to answer."** Framer's servers were slow to open the project. Try again in a minute.

**"Too many sessions are open with this Framer API key."** Several posts or workflows reached the project at once. Try again in a minute.

## Related

<Columns cols={2}>
  <Card title="Character and media limits" icon="ruler" href="/help/channel-limits">
    Every network's limits in one table.
  </Card>

  <Card title="Delete a post" icon="trash-2" href="/help/delete-a-post">
    What deleting does on each network.
  </Card>
</Columns>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.