Home / Developers
Gorvado API for CRM and ERP
Keep Gorvado in sync with your systems: import products and stock from your CRM, ERP or spreadsheet, export leads, buyer contacts and offers, reply to buyers and receive real-time webhooks. Available on Standard and Premium seller plans.
Quick start
- Open Account → API and integrations and create a key (read, or read + write).
- Send it in every request:
Authorization: Bearer gv_live_… - All requests and responses are JSON over HTTPS. Base URL:
https://gorvado.com/api/v1
curl https://gorvado.com/api/v1/me \
-H "Authorization: Bearer gv_live_XXXXXXXX"Endpoints
| Method | Path | Scope | What it does |
|---|---|---|---|
GET | /api/v1/me | read | Your company, plan, credit balance and key scopes. |
GET | /api/v1/categories?attributes=1 | read | Category tree with attribute definitions (map your CRM fields). |
GET | /api/v1/products | read | Your products. Filters: status, updated_since, external_id. Paginated. |
POST | /api/v1/products | write | Create or update one product, or up to 100 at once (array). Upsert by id or external_id. |
GET | /api/v1/products/{id | ext:EXTERNAL_ID} | read | One product. |
PATCH | /api/v1/products/{id | ext:EXTERNAL_ID} | write | Partial update (stock, price…) or action: pause | resume | close. |
DELETE | /api/v1/products/{id | ext:EXTERNAL_ID} | write | Close the product. |
GET | /api/v1/conversations | read | Leads: conversations with buyers (inbound / outbound), last message, buyer block. |
GET | /api/v1/conversations/{id}/messages | read | Messages of a conversation. |
POST | /api/v1/conversations/{id}/messages | write | Reply to the buyer from your CRM. |
GET | /api/v1/contacts | read | Buyer companies whose contact details you opened (credits or inbound). |
GET | /api/v1/offers | read | Offers you sent to buying requests and their status. |
GET | /api/v1/requests | read | Open buying requests (opportunities). mine=1 → your categories. |
Import products from your CRM / ERP
Send your own ID as external_id (CRM ID or SKU) — the same call creates the product the first time and updates it next time. New products are drafts; add "submit": true and at least one photo to send them to moderation. Published products update right away.
curl -X POST https://gorvado.com/api/v1/products \
-H "Authorization: Bearer gv_live_XXXXXXXX" -H "Content-Type: application/json" \
-d '{
"external_id": "SKU-1042",
"title": "Nitrile gloves, box of 100",
"category": "safety-equipment",
"description": "Powder-free, 4 mil, sizes S–XL.",
"condition": "New",
"price": 6.4, "unit": "cases", "quantity": 1200, "moq": 20,
"price_tiers": [{ "min_quantity": 100, "price": 5.9 }, { "min_quantity": 500, "price": 5.5 }],
"city": "Dallas", "state": "TX", "zip": "75201", "terms": "FOB",
"payment_methods": ["ach", "wire_transfer"], "delivery_methods": ["freight", "pickup"], "pickup_zip": "75201", "shipping_cost_type": "calculated_separately",
"attributes": { "model_sku": "NG-100" },
"photos": ["https://cdn.yourshop.com/ng-100.jpg"],
"submit": true
}'Sync many at once: send an array of up to 100 products (response 207 with a result per item). Stock-only update: PATCH /api/v1/products/ext:SKU-1042 {"quantity": 950}. Payment methods: cash, ach, wire_transfer, check, credit_debit_card, other. Delivery: pickup, seller_delivery, freight, parcel, other. Photos: public https JPG / PNG / WebP up to 10 MB; sending photos replaces all photos.
Export leads and buyer contacts
GET /api/v1/conversations?updated_since=2026-11-01T00:00:00Z returns your leads. Every lead has a buyer block with the company, city and state. Email and phone are included only after your company opened the buyer's contact details (free for inbound contacts, 1 Buyer Access Credit for outbound) and only if the buyer shares them. The API never spends credits — open contacts on the website. Use buyer details only for that business inquiry (no spam, no resale).
{
"data": [{
"id": "cm3…", "type": "inbound",
"buyer": { "key": "company:cm2…", "company": "Bright Retail LLC", "city": "Dallas", "state": "TX",
"contacts": { "name": "Chris Parker", "email": "chris@…", "phone": "+1 214…", "access": "inbound" } },
"product": { "id": "cm1…", "title": "Nitrile gloves, box of 100" },
"last_message": { "from": "buyer", "body": "Can you do 300 cases?", "created_at": "2026-11-13T15:02:11Z" }
}],
"has_more": false, "next_cursor": null
}Webhooks
Add an https endpoint in Account → API and integrations. We POST JSON and retry once on failure.
message.created— A buyer sent your company a message (new lead or reply)offer.decided— A buyer accepted or declined your offerrequest.matched— A new buying request in your categoriesproduct.status_changed— A product was approved, sent back or rejected by moderationproduct.expiring— A product expires in 7 or 2 daysbilling.updated— Your plan or payment status changed
POST https://hooks.yourcrm.com/gorvado
X-Gorvado-Event: message.created
X-Gorvado-Signature: t=1763046000,v1=5f2c…
{ "id": "evt_…", "event": "message.created", "created": "2026-11-13T15:02:11Z",
"data": { "title": "Nitrile gloves, box of 100", "from": "Bright Retail LLC",
"conversationId": "cm3…", "url": "https://gorvado.com/messages/cm3…" } }Verify the signature: compute HMAC-SHA256 of `${t}.${rawBody}` with your signing secret and compare it with v1; reject events older than 5 minutes. Then fetch details with the API (e.g. the conversation's messages).
// Node.js
const [t, v1] = req.headers['x-gorvado-signature'].split(',').map((p) => p.split('=')[1]);
const ok = crypto.timingSafeEqual(
Buffer.from(v1, 'hex'),
crypto.createHmac('sha256', process.env.GORVADO_WEBHOOK_SECRET).update(`${t}.${rawBody}`).digest()
) && Math.abs(Date.now() / 1000 - Number(t)) < 300;Scheduled sync (no code)
In Account → API and integrations → Scheduled sync choose what to sync, a URL, how often (every hour, every 6 hours, every day or chosen days), the time and your time zone, and tick Automatic.Import: Gorvado downloads your CSV, Excel or JSON file (e.g. a stock export from your ERP or a published Google Sheet) and updates products matched by external_id / sku — only existing ones, or also new ones.Export: Gorvado POSTs new and changed products, leads, contacts, offers or buying requests to your URL in signed JSON batches of up to 200 records. “Run now” starts a sync immediately; every run is in the history with counts and errors.
sku,quantity,price
SKU-1042,950,6.20
SKU-1043,0,7.10Rules
- Pagination:
limit(up to 100) andcursor=next_cursorfrom the previous page.updated_sincefor incremental sync. - Rate limit: 120 requests per minute per key (HTTP 429).
- Errors:
{ "error": { "code": "validation_error", "message": "…", "field": "price" } }— 400 bad JSON, 401 bad key, 402 no plan with API access, 403 missing scope, 404, 409, 422 validation, 429. - Products follow the same posting rules as the website (no contacts in titles and descriptions, prohibited items, moderation of new listings).
- Keys belong to your company. Revoke a key in your account if it leaks.