Developer pages
Zinvee CRMAPI 2026-09-12

CRM API reference

Base URL https://api.crm.diginetacademy.in/api/v1. Send a key as X-API-Key; the guide covers keys, paging, the change feed, errors and limits. The OpenAPI 3.1 description is at /public/openapi.json.

Identity

What this key is.

What this key is, what it may do, and what it has spent today

get/public/whoami

Requires a valid key but no particular scope. Carries no lead data and costs no rows — make it the first node of every workflow so a bad key fails loudly and early.

Response 200

The key’s identity and today’s usage. Returns Whoami.

Errors: 400, 401, 403, 429, 500

Request
curl "https://api.crm.diginetacademy.in/api/v1/public/whoami" \
  -H "X-API-Key: $CRM_KEY"

Leads

People.

List leads

get/public/leads

Scope: LEADS_READ. Ordered by id ascending.

Query

  • updatedSincestring (date-time)

    Incremental sync: only rows changed at or after this instant.

  • createdSincestring (date-time)

    Only rows created at or after this instant.

  • primaryStatusstring

    The lead badge, which mirrors the person’s NEWEST inquiry.

    One of: NEW, IN_PROGRESS, CONVERTED, LOST, DORMANT

  • campaignIdstring

    Leads holding at least one inquiry in this campaign.

  • assignedToUserIdstring

    A user id from GET /public/reference, or the literal unassigned.

  • phonestring

    Digit-tail match on phone and alternatePhone, so "+91 98765 43210" and "9876543210" find the same person.

  • limitinteger

    Rows per page.

    1 to 200. Default 50

  • cursorstring

    Opaque keyset cursor. Pass back the previous response’s nextCursor; stop when it is null.

Response 200

A page of leads.

  • itemsLead[]required
  • nextCursorstring | nullrequired

    Pass as cursor for the next page. null is the terminal condition.

  • hasMorebooleanrequired

Errors: 400, 401, 403, 429, 500

Request
curl "https://api.crm.diginetacademy.in/api/v1/public/leads" \
  -H "X-API-Key: $CRM_KEY"

One lead with all of its inquiries

get/public/leads/{id}

Scope: LEADS_READ. Costs 1 row.

Path

  • idstringrequired

    Lead id.

Response 200

The lead, newest inquiry first. Returns any.

Errors: 400, 401, 403, 404, 429, 500

Request
curl "https://api.crm.diginetacademy.in/api/v1/public/leads/clx1lead0001" \
  -H "X-API-Key: $CRM_KEY"

Inquiries

A person’s interest in one campaign.

List inquiries

get/public/inquiries

Scope: INQUIRIES_READ. This is where segmentation lives — lifecycle is resolved from the stage’s closes/converts flags, so it keeps working when an organization renames its stages.

Query

  • updatedSincestring (date-time)

    Incremental sync: only rows changed at or after this instant.

  • createdSincestring (date-time)

    Only rows created at or after this instant.

  • campaignIdstring

    Campaign id.

  • campaignCodestring

    Campaign code from GET /public/reference.

  • stageCodestring

    Stage code from GET /public/reference.

  • lifecyclestring

    Derived from the stage flags, never from a hardcoded code.

    One of: open, closed, converted, lost

  • dispositionCodestring

    The last call outcome applied.

  • assignedToUserIdstring

    A user id from GET /public/reference, or the literal unassigned.

  • hasBalanceboolean

    true = a fee is set and not fully paid.

  • includeNurtureboolean

    Include the long-term Nurture pool. Off by default — a consumer asking for open work almost never means the parked rows.

    Default false

  • limitinteger

    Rows per page.

    1 to 200. Default 50

  • cursorstring

    Opaque keyset cursor. Pass back the previous response’s nextCursor; stop when it is null.

Response 200

A page of inquiries.

  • itemsInquiry[]required
  • nextCursorstring | nullrequired

    Pass as cursor for the next page. null is the terminal condition.

  • hasMorebooleanrequired

Errors: 400, 401, 403, 429, 500

Request
curl "https://api.crm.diginetacademy.in/api/v1/public/inquiries" \
  -H "X-API-Key: $CRM_KEY"

One inquiry, with the lead and optional expansions

get/public/inquiries/{id}

Scope: INQUIRIES_READ. Costs 1 row.

Path

  • idstringrequired

    Inquiry id.

Query

  • includestring

    CSV of tags, customFields, formAnswers, payments. Unknown names are ignored.

Response 200

The inquiry. Returns InquiryDetail.

Errors: 400, 401, 403, 404, 429, 500

Request
curl "https://api.crm.diginetacademy.in/api/v1/public/inquiries/clx1inq0001" \
  -H "X-API-Key: $CRM_KEY"

Follow-ups

Scheduled callbacks.

Live scheduled callbacks

get/public/follow-ups

Scope: FOLLOWUPS_READ. Only live rows (PENDING or OVERDUE) on inquiries that are still open, so a closed lead’s stray callback never reaches an automation.

Query

  • windowstring

    due = scheduled at or before now. overdue = the sweep has already flagged it (a subset of due). today = the IST calendar day. upcoming = still in the future.

    One of: due, overdue, today, upcoming. Default "due"

  • assignedToUserIdstring

    A user id from GET /public/reference, or the literal unassigned.

  • includeNurtureboolean

    Include the long-term Nurture pool. Off by default — a consumer asking for open work almost never means the parked rows.

    Default false

  • limitinteger

    Rows per page.

    1 to 200. Default 50

  • cursorstring

    Opaque keyset cursor. Pass back the previous response’s nextCursor; stop when it is null.

Response 200

A page of follow-ups.

  • itemsFollowUp[]required
  • nextCursorstring | nullrequired

    Pass as cursor for the next page. null is the terminal condition.

  • hasMorebooleanrequired

Errors: 400, 401, 403, 429, 500

Request
curl "https://api.crm.diginetacademy.in/api/v1/public/follow-ups" \
  -H "X-API-Key: $CRM_KEY"

Events

The append-only change feed.

The change feed

get/public/events

Scope: EVENTS_READ. Store nextCursor and send it back as since on the next poll.

The feed holds events back by a couple of seconds: a sequence number is allocated when a transaction inserts, not when it commits, so reading right up to "now" would let a poller step over an event that had not become visible yet — permanently.

An unrecognised eventType is not an error; it simply matches nothing.

Query

  • sinceinteger

    Exclusive: the last seq you processed.

    At least 0

  • sinceMinutesinteger

    Used ONLY when since is absent, so a first manual run needs no stored cursor.

    1 to 1440. Default 60

  • eventTypestring

    CSV, at most 20 entries. Published vocabulary: lead.created, lead.updated, lead.merged, lead.deleted, inquiry.created, inquiry.deleted, inquiry.stage_changed, inquiry.won, inquiry.lost, payment.recorded, followup.due, import.completed, leads.bulk_updated, org.leads_wiped.

  • includeSuppressedboolean

    Include bulk/machine rows (a CSV import, the dormancy sweep) so a mirror stays correct.

    Default false

  • limitinteger

    Rows per page.

    1 to 500. Default 100

Response 200

A page of events, oldest first.

  • itemsEvent[]required
  • nextCursorinteger | nullrequired
  • hasMorebooleanrequired

Errors: 400, 401, 403, 410, 429, 500

Request
curl "https://api.crm.diginetacademy.in/api/v1/public/events" \
  -H "X-API-Key: $CRM_KEY"

Reference

Per-organization codes.

Every per-organization code an automation must resolve

get/public/reference

Scope: REFERENCE_READ. Stages, dispositions, sources and courses are editable rows with free-form codes — not enums — so branching on admitted without reading this first is how a workflow silently stops matching. Costs no rows.

Response 200

The organization’s vocabulary. Returns Reference.

Errors: 400, 401, 403, 429, 500

Request
curl "https://api.crm.diginetacademy.in/api/v1/public/reference" \
  -H "X-API-Key: $CRM_KEY"

This document

get/public/openapi.json

No API key required.

Response 200

This OpenAPI document.

Request
curl "https://api.crm.diginetacademy.in/api/v1/public/openapi.json" \
  -H "X-API-Key: $CRM_KEY"

Objects

The shapes the API returns.

Lead

  • idstringrequired
  • namestring | null
  • phonestringrequired

    As stored, which is NOT guaranteed dialable — imports and ad forms wrote raw strings. Send to phoneE164 and skip the row when it is null.

  • phoneE164string | null
  • alternatePhonestring | null
  • emailstring | null
  • primaryStatusstringrequired

    Mirrors the person’s NEWEST inquiry, so a lead can read NEW while holding a CONVERTED inquiry. Message the wrong one and you contact an admitted student.

    One of: NEW, IN_PROGRESS, CONVERTED, LOST, DORMANT

  • assignedToobject | null
    • idstring
    • fullNamestring
  • tagsstring[]required
  • firstInquiryAtstring (date-time) | null
  • lastInquiryAtstring (date-time) | null
  • lastCalledAtstring (date-time) | null
  • nextFollowupAtstring (date-time) | null
  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required

Inquiry

  • idstringrequired
  • leadIdstringrequired
  • campaignIdstringrequired
  • campaignCodestring | null
  • campaignNamestring | null
  • stageCodestring | null
  • stageNamestring | null
  • lifecyclestringrequired

    Derived from the stage’s closes/converts flags.

    One of: open, converted, lost

  • dispositionCodestring | null
  • sourceCodestring | null
  • courseCodestring | null
  • assignedToobject | null
    • idstring
    • fullNamestring
  • attemptCountintegerrequired
  • totalFeeinteger | null

    Whole rupees. null = not captured yet.

  • paidAmountintegerrequired
  • balanceinteger | null

    null when no fee is set — which is not the same as nothing owed.

  • nextFollowupAtstring (date-time) | null
  • closedAtstring (date-time) | null
  • closedReasonstring | null
  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required

InquiryDetail

  • idstringrequired
  • leadIdstringrequired
  • campaignIdstringrequired
  • campaignCodestring | null
  • campaignNamestring | null
  • stageCodestring | null
  • stageNamestring | null
  • lifecyclestringrequired

    Derived from the stage’s closes/converts flags.

    One of: open, converted, lost

  • dispositionCodestring | null
  • sourceCodestring | null
  • courseCodestring | null
  • assignedToobject | null
    • idstring
    • fullNamestring
  • attemptCountintegerrequired
  • totalFeeinteger | null

    Whole rupees. null = not captured yet.

  • paidAmountintegerrequired
  • balanceinteger | null

    null when no fee is set — which is not the same as nothing owed.

  • nextFollowupAtstring (date-time) | null
  • closedAtstring (date-time) | null
  • closedReasonstring | null
  • createdAtstring (date-time)required
  • updatedAtstring (date-time)required
  • leadLeadrequired
  • tagsstring[]
  • campaignCustomFieldsobject
  • formAnswersobject[]

    Facebook Lead Ads question/answer pairs, in display order.

  • paymentsobject[]

FollowUp

  • idstringrequired
  • inquiryIdstringrequired
  • leadIdstringrequired
  • leadobjectrequired
    • idstring
    • namestring | null
    • phonestring
    • phoneE164string | null
  • assignedToobject | null
    • idstring
    • fullNamestring
  • scheduledAtstring (date-time)required
  • statusstringrequired

    One of: PENDING, OVERDUE

  • kindstringrequired
  • createdAtstring (date-time)required

Event

  • seqintegerrequired

    Your cursor. Strictly increasing.

  • apiVersionstringrequired
  • eventTypestringrequired
  • leadIdstring | null

    A plain id with no foreign key — a delete event outlives its row.

  • inquiryIdstring | null
  • dataobjectrequired

    Ids, codes and before/after values only — never a snapshot of the person. Hydrate the person from GET /public/leads/{id}, which is always current.

  • suppressedbooleanrequired
  • occurredAtstring (date-time)required

Reference

  • organizationobject
    • idstring
    • namestring
    • timezonestring
  • stagesobject[]
  • dispositionsobject[]
  • campaignsobject[]
  • sourcesobject[]
  • coursesobject[]
  • tagsobject[]
  • usersobject[]

Whoami

  • keyIdstring
  • keyPrefixstring
  • namestring
  • apiVersionstring
  • organizationobject
    • idstring
    • namestring
    • timezonestring
  • scopesstring[]
  • expiresAtstring (date-time) | null
  • limitsobject
    • rateLimitPerMinuteinteger
    • rowRateLimitPerMinuteinteger
    • dailyRowBudgetinteger
  • todayobject

    IST day. Excludes the whoami call you are making.

    • daystring
    • requestsinteger
    • rowsReturnedinteger
    • errorsinteger
    • rateLimitedinteger