"Your system" is a board subscription channel that sends new cargo and vessels to your own software once an hour: a CRM, a Google Sheet, an internal database or a Telegram bot. The channel comes with the PRO plan. Rynda sends one signed POST request with JSON carrying every new listing that matches the subscription filter, and your system decides where to store or forward them.
https://.The request body is JSON: type set to board.new_listings, the delivery number id, the language lang, the send time deliveredAt, the listing count total and the items list. Each item carries:
| Field | Contents |
|---|---|
id |
the listing's permanent key; use it to drop duplicates |
side, source, dealTag |
board side (cargo or vessel), broker or direct listing (broker, direct), deal type code |
title, summary |
listing title and a ready-made line for a chat or a sheet: deal type, route, size, date |
from, to, regions |
loading port or the vessel's open port, discharge port, the vessel's trading areas; each port has a name, country and coordinates. English names (nameEn, countryEn, regionsEn) always come, whatever the request language |
dateFrom, dateTo |
loading or open date and the end of the window |
weightTons, weightTonsMax, dwt |
cargo weight or vessel deadweight |
cargoType, vesselType and the codes cargoTypeKey, vesselTypeKey |
cargo or vessel type |
price, commissionPercent |
rate and commission, when the author gave them |
postedBy |
author type (Company or Individual) and the verification mark |
publishedAt, firstSeenAt, url |
publication time, when the listing appeared on the board, link to the listing |
Text in the request is in the language set for your notification emails. When a broker listing has no English version of a field, that field comes as null in an English request. Codes (dealTag, cargoTypeKey, source) do not depend on the language, which makes them handy for filtering. The author's name and contacts are not included: reach them through the link.
To make sure a request comes from Rynda, check the X-Rynda-Signature header: sha256= followed by the HMAC-SHA256 of the request body under your signing key. The key is in the panel under the channel row, Signing key. If the key leaks, click Issue a new key there: the old one stops working at once.
A Google Apps Script web app cannot read request headers. Add your own secret parameter to the address, for example https://script.google.com/macros/s/…/exec?key=your-secret, and check it in the handler:
function doPost(e) {
if (e.parameter.key !== 'your-secret') return ContentService.createTextOutput('forbidden');
const data = JSON.parse(e.postData.contents);
const sheet = SpreadsheetApp.getActive().getSheetByName('Rynda');
const known = new Set(sheet.getRange('A:A').getValues().flat());
data.items
.filter((item) => !known.has(item.id))
.forEach((item) => sheet.appendRow([item.id, item.firstSeenAt, item.summary, item.url]));
return ContentService.createTextOutput('ok');
}
A request counts as accepted when your system replies with a 2xx code or a 301, 302 or 303 redirect, which is how Google Apps Script answers after doPost runs. If there is no reply within 15 seconds or the reply is an error, the listings are not lost: they go out next hour together with the new ones. So the same listing can arrive twice; drop duplicates by id. If your system rejects requests for two days in a row, delivery is paused and the panel shows a notice with the last error. Check the address and click Resume to get everything that piled up. One request carries up to 500 listings; the rest go out next hour.
A subscription filtered by deal type only sends listings with that type. Some broker cargo listings have no deal type: to receive them, subscribe without a deal type filter.
To forward listings to a Telegram group, have your system send the summary field and the url link with its own bot after it receives the request.
Listings received this way are for your company's own work. Reselling or publishing them is not allowed (Terms of Use).