Developers

The Glime API

API-first by design — the Glime UI is built on the same API you get.

Everything in Glime is addressable: records, products, pricing, quotes, approval workflows and a full export of your workspace. ERP, accounting, procurement and e-commerce platforms integrate without custom database access.

This page is split deliberately. Available now is what the backend answers today and what you can build against this afternoon. Designed, not yet shipped is the contract the roadmap is held to — published so an integration you build now still fits when it lands, and marked so nobody plans a launch around it. The build order is tracked in erp-integration.md.

Status: the v1 design is below, with the shipped subset marked “Available now”. Today the API is reached with the same session token the Glime app uses; scoped API keys, GraphQL and outbound webhooks are roadmap, not live. The interactive sandbox runs on a local data layer that mirrors these signatures one-to-one (GlimeData.list/get/create), so integrations built against the shipped surface will not need rework.

Authentication Available now

The API takes the same bearer session token the Glime app signs in with. Post your credentials to /api/v1/auth/login and send the token it returns on every call. Tokens are revocable: changing a password or signing out everywhere invalidates every token already issued.

curl -s https://your-glime-host/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com","password":"…"}'

curl https://your-glime-host/api/v1/account \
  -H "Authorization: Bearer <token>"

Because that token belongs to a person, it carries that person's role: the API can never return more than the signed-in user could see in the app. That is the right default and the wrong ergonomics for a nightly ERP sync, which is what non-interactive API keys below are for.

API keys Roadmap

Scoped, rotatable keys created per workspace in Settings → API, sent as a bearer token and belonging to the workspace rather than to a person — so a sync does not break when someone leaves. Planned shape:

curl https://api.glimecrm.com/v1/accounts \
  -H "Authorization: Bearer glime_sk_live_…"

REST resources Available now

Everything here is mounted under /api/v1 and answers today. Every query is scoped to your workspace, and reads are filtered by the signed-in user's role.

ResourceEndpointsNotes
/v1/accountGET, POST, PATCH, DELETECompany records. Same generic contract for every object below.
/v1/contactGET, POST, PATCH, DELETEPeople, with the activity timeline
/v1/leadGET, POST, PATCH, DELETEScoring and routing fields
/v1/opportunityGET, POST, PATCH, DELETEPipeline and stages
/v1/productGET, POST, PATCH, DELETECatalogue, with category and price
/v1/contract, /v1/sales-orderGET, POST, PATCH, DELETEProfessional and up — a Starter workspace gets a 402
/v1/cpq/quotesGET, POSTCreate a quote; it is priced on the server, never from a posted total
/v1/cpq/quotes/{id}/submitPOSTBuild the approval chain from the published policy
/v1/cpq/quotes/{id}/decidePOSTApprove or reject a step, with a reason. A rep can never approve their own quote.
/v1/cpq/quotes/{id}/sharePOSTMint a customer link for an approved quote
/v1/_exportGETFull workspace export — every object, on any plan, and still served if your term lapses
/v1/_layoutGET, PUTThe workspace's field layout
/v1/cpq/configGET, PUTThe published CPQ configuration and its staged draft
/v1/integrationsGETThe connector catalogue and this workspace's connections. Professional and up.
/v1/integrations/{slug}/connectPOSTStore a credential, encrypted. Admin only; never readable back.
/v1/integrations/{slug}/push/{quoteId}POSTHand an approved quote to the connector. A quote that has not cleared its chain is refused.
/v1/integrations/{slug}/syncPOSTRun everything pending for that connector
/v1/integrations/jobsGETThe push log, with each vendor's own error text
/v1/integrations/{slug}/push-contract/{id}POSTHand a signed contract across. One still under negotiation is refused.
/v1/integrations/{slug}/pullPOSTBring sales orders back. Only orders this workspace pushed are taken.
/v1/integrations/webhooks/subscriptionsGET, POST, DELETEOutbound webhook subscriptions

Designed, not yet shipped Roadmap

Published so an integration you build today still fits when these land. None of them answers yet; a call to one gets a 404.

ResourceEndpointsNotes
/v1/quotes/{id}/pricePOSTStandalone pricing run against an unsaved quote
/v1/quotes/{id}/pdfPOSTRender branded proposal (PDF/Word/HTML)
/v1/ai/recommendationsPOSTRoadmap: bundle suggestions, pricing-mistake detection, upsells

GraphQL Roadmap

Designed, not shipped — there is no GraphQL endpoint today. The intended shape, one endpoint at https://api.glimecrm.com/graphql for cross-object reads in a single round trip:

query DealDesk($id: ID!) {
  opportunity(id: $id) {
    name stage amount winProbability
    account { name industry }
    quotes {
      number version total status
      lines { product qty unitPrice discount net }
      approvals { step approver status }
    }
  }
}

Outbound webhooks Available now

Subscribe to quote.created, quote.version.created, approval.requested, approval.completed, contract.signed, order.created and export.completed. Create a subscription at POST /v1/integrations/webhooks/subscriptions with an https URL and the events you want; the signing secret is returned once and never again.

Every delivery carries X-Glime-Signature — sha256= followed by an HMAC-SHA256 of the raw body with your secret — plus X-Glime-Event and X-Glime-Delivery. Verify against the raw bytes; a re-serialized body will not match. The timestamp is inside the signed payload as sentAt, not in a header, so a captured delivery cannot be replayed indefinitely.

A non-2xx is retried with exponential backoff for 24 hours, then dead-lettered with the status your endpoint returned. A 4xx is treated as terminal — if the request is wrong, it will be wrong next time too.

{
  "event": "approval.completed",
  "sentAt": "2026-09-22T18:30:00.000Z",
  "data": { "quote": "q-2214", "status": "approved" }
}

Rate limits

There is no metered API tier and no per-call charge. Nothing on the pricing page sells API calls, so nothing here bills for them. What exists today is abuse protection: sign-in is rate limited per account and per IP, and an account locks out after repeated failures.

Per-key quotas and usage reporting arrive with API keys. When they do, hard caps will be configurable so a runaway integration can never surprise you on an invoice — and if a paid tier is ever introduced, it will be on the pricing page before it is on this one.

Errors

{
  "error": {
    "type": "validation_error",
    "code": "discount_exceeds_threshold",
    "message": "35% discount requires Finance approval.",
    "docs": "https://glimecrm.com/developers.html#approvals"
  }
}

Get an API key — start a trial Build an extension