Prep list API

The prep list API lets a script or automation tool create a prep list in Rinvy. For example, a Google Sheet that works out tonight's prep from your counts can send the list to Rinvy, so the team checks items off in the app.

Each request creates one draft prep list. It shows on the Prep page like a list you made by hand. A manager reviews it and approves it. Then the staff check off what they make, and each checked recipe adds what was made to inventory, as on any prep list. The request itself never changes stock.

Create an API key

  1. Go to Kitchen Settings and open the Integrations section.

  2. Under Automation API keys, type a name for the key, for example "Prep sheet".
  3. Tick Create prep lists. Tick Send sales too if the same tool also sends sales.

  4. Press Create key.
  5. Press Copy key and paste it into your tool. Then press Done.

Create a prep list

Send a POST request to:

https://api.rinvy.app/api/v1/prep-lists

Put the key in the Authorization header as Bearer <your key>, and send the body as JSON with Content-Type: application/json. Rinvy refuses a key in the address (?api_key=).

The request body

{
  "prepDate": "2026-11-08",
  "name": "Night prep",
  "items": [
    { "recipe": "Pizza Dough", "batches": 4, "instructions": "Proof 2 hours" },
    { "recipe": "Red Sauce", "batches": 2 },
    { "title": "Label and date the cheese bins" }
  ]
}
  • prepDate is the day the prep is for, as YYYY-MM-DD in your kitchen's timezone. Leave it out for today.
  • name is optional. It labels the list on the Prep page, up to 100 characters.
  • items holds 1 to 200 items, in the order they show on the list. Each item is one of:
    • a recipe by name: recipe is the recipe's name as it shows on the Recipes page. Capital letters and spaces at the ends don't matter.
    • a recipe by id: recipeId, for when two recipes share a name.
    • a task: title is any to-do with no recipe, such as "Wipe down the line".
  • batches is how many batches of the recipe to make. It can be a decimal, such as 1.5. Leave it out for 1. A task has no batches, so a task item with batches is refused.
  • instructions is an optional note on the item, up to 1,000 characters.

A recipe can be on a list once. The recipe must make a product, so a recipe that only belongs to a menu item can't go on a prep list.

The response

A successful request returns 201:

{
  "ok": true,
  "prepListId": "…",
  "status": "DRAFT",
  "prepDate": "2026-11-08",
  "name": "Night prep",
  "itemCount": 3
}

The list shows the key's name as its creator, for example Prep sheet (API key).

Every request creates a new list. If your script runs twice, you get two drafts. Discard the extra one on the Prep page.

A refused request returns "ok": false and an error that says what to fix. Nothing is created.

StatusMeaning
400The body is wrong, or an item doesn't match a recipe. The error names every item to fix, for example items[2]: no recipe named "Garlic Knots".
401The key is missing, wrong, revoked, or sent in the address instead of the header.
403The key can't create prep lists, or your plan doesn't include prep lists.
413The body is larger than 256 KB.
415The body isn't JSON. Send it with Content-Type: application/json.
429Too many requests. A key can create 30 prep lists an hour.
500Something went wrong in Rinvy. Nothing is created. Try again later.

Google Sheets example

The Google Apps Script below sends tonight's prep from a tab named Prep with the columns Recipe, Batches and Notes. A row with no batches number goes on the list as a task.

  1. In your Google Sheet, open Extensions → Apps Script.
  2. Paste the script below and put your key in RINVY_API_KEY.
  3. Run sendPrepList once and approve the permissions it asks for.
  4. To send it every night, open Triggers (the clock icon), add a trigger for sendPrepList, and pick a daily time-driven schedule after your closing count.

const RINVY_API_KEY = 'rk_live_YOUR_KEY';
const RINVY_URL = 'https://api.rinvy.app/api/v1/prep-lists';

function sendPrepList() {
  const tz = Session.getScriptTimeZone();
  const tomorrow = new Date(Date.now() + 24 * 60 * 60 * 1000);
  const prepDate = Utilities.formatDate(tomorrow, tz, 'yyyy-MM-dd');

  const rows = SpreadsheetApp.getActive().getSheetByName('Prep').getDataRange().getValues();
  const items = [];
  rows.slice(1).forEach(([recipe, batches, notes]) => {
    if (!recipe) return;
    const note = notes ? String(notes) : undefined;
    if (batches === '' || batches === null) {
      items.push({ title: String(recipe), instructions: note });
    } else if (Number(batches) > 0) {
      items.push({ recipe: String(recipe), batches: Number(batches), instructions: note });
    }
  });
  if (items.length === 0) return;

  const response = UrlFetchApp.fetch(RINVY_URL, {
    method: 'post',
    contentType: 'application/json',
    headers: { Authorization: 'Bearer ' + RINVY_API_KEY },
    payload: JSON.stringify({ prepDate: prepDate, name: 'Prep from the sheet', items: items }),
    muteHttpExceptions: true,
  });
  Logger.log(response.getResponseCode() + ' ' + response.getContentText());
}

The script makes the list for tomorrow. Change tomorrow to new Date() to make it for today.

Can the API read or change a list after it's made?

Not yet. The API only creates lists. To change a list, open it on the Prep page. To read lists or change them from Claude, use the Claude connector instead.