The Geniziz REST API. Everything in the app is built on it, so anything you can do in the product you can automate.
Authentication
Send your API key as HTTP Basic auth — the key is the username, the password is blank. Set the api_key collection variable once and every request inherits it. Create keys under Settings → API & Webhooks.
curl -u YOUR_API_KEY: {{base_url}}/api/v1/me/
Base URL
The base_url variable (defaults to your app domain).
IDs
Opaque, prefixed strings — lead_…, cont_…, oppo_…, acti_…, task_…. Never assume a format beyond the prefix.
Responses & pagination
Single resources return the object. List endpoints return { "data": [ … ], "has_more": true|false } and page with _limit (default 100, max 200) and _skip (offset).
Field selection
Add _fields=id,name,date_created to any read to trim the response.
Errors
Non-2xx responses use { "error": "message", "field-errors": { "field": "why" } } with a matching HTTP status (400 validation, 401 auth, 402 billing, 404 not found, 405 method, 429 rate limit).
Rate limits
Per-endpoint-group limits with standard ratelimit-* response headers.
MCP
The same key authenticates the MCP server at {{base_url}}/mcp/ (send a Geniziz-Scope header of read, write_safe, or write_destructive) for AI agents.
Alongside task-specific tools (search, send_email, lead scoring…), generic list_records / get_record / create_record / update_record / delete_record tools dispatch into the same handlers as this reference and cover every business resource here — so an agent can work the whole CRM. Admin/identity endpoints (users, roles, API keys, credentials, organization) are intentionally not exposed over MCP.
Workspaces over MCP
An OAuth connection (Bearer oat_…, obtained through /oauth2/authorize/) authenticates the user, so it reaches every workspace they are an active member of — not only the one they consented in. list_workspaces returns them with the active one flagged, switch_workspace moves the connection for good (surviving refresh-token rotation), and passing a workspace argument to any other tool targets a single call without moving. Membership, role, and permissions are re-read in the target workspace on every call, so this grants nothing the user does not already have there.
An API key is scoped to the workspace it was created in and cannot switch — create a key inside the other workspace instead.
Activity
GET
List activities
https://app.geniziz.com/api/v1/activity/?_limit=100&_skip=0&_fields=
GET /activity/ — the unified stream, newest first.
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
GET
Note activity
https://app.geniziz.com/api/v1/activity/note/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
POST
Note activity
https://app.geniziz.com/api/v1/activity/note/
Request body (JSON)
{
}
GET
Get activity
https://app.geniziz.com/api/v1/activity/note/:id/?_fields=
Query parameters
| _fields | Comma-separated fields to return. |
PUT
Update activity
https://app.geniziz.com/api/v1/activity/note/:id/
Request body (JSON)
{
}
DELETE
Delete activity
https://app.geniziz.com/api/v1/activity/note/:id/
GET
Call activity
https://app.geniziz.com/api/v1/activity/call/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
POST
Call activity
https://app.geniziz.com/api/v1/activity/call/
Request body (JSON)
{
}
GET
Get activity
https://app.geniziz.com/api/v1/activity/call/:id/?_fields=
Query parameters
| _fields | Comma-separated fields to return. |
PUT
Update activity
https://app.geniziz.com/api/v1/activity/call/:id/
Request body (JSON)
{
}
DELETE
Delete activity
https://app.geniziz.com/api/v1/activity/call/:id/
GET
Channel message activity
https://app.geniziz.com/api/v1/activity/channel_message/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
POST
Channel message activity
https://app.geniziz.com/api/v1/activity/channel_message/
Request body (JSON)
{
}
GET
Get activity
https://app.geniziz.com/api/v1/activity/channel_message/:id/?_fields=
Query parameters
| _fields | Comma-separated fields to return. |
PUT
Update activity
https://app.geniziz.com/api/v1/activity/channel_message/:id/
Request body (JSON)
{
}
DELETE
Delete activity
https://app.geniziz.com/api/v1/activity/channel_message/:id/
GET
Lead activity
https://app.geniziz.com/api/v1/activity/status_change/lead/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
GET
Opportunity activity
https://app.geniziz.com/api/v1/activity/status_change/opportunity/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
GET
Created activity
https://app.geniziz.com/api/v1/activity/created/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
GET
Task completed activity
https://app.geniziz.com/api/v1/activity/task_completed/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
GET
Custom activity
https://app.geniziz.com/api/v1/activity/custom/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
POST
Custom activity
https://app.geniziz.com/api/v1/activity/custom/
Request body (JSON)
{
}
GET
Get activity
https://app.geniziz.com/api/v1/activity/custom/:id/?_fields=
Query parameters
| _fields | Comma-separated fields to return. |
PUT
Update activity
https://app.geniziz.com/api/v1/activity/custom/:id/
Request body (JSON)
{
}
DELETE
Delete activity
https://app.geniziz.com/api/v1/activity/custom/:id/
GET
Email activity
https://app.geniziz.com/api/v1/activity/email/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
POST
Email activity
https://app.geniziz.com/api/v1/activity/email/
Request body (JSON)
{
}
GET
Get activity
https://app.geniziz.com/api/v1/activity/email/:id/?_fields=
Query parameters
| _fields | Comma-separated fields to return. |
PUT
Update activity
https://app.geniziz.com/api/v1/activity/email/:id/
Request body (JSON)
{
}
DELETE
Delete activity
https://app.geniziz.com/api/v1/activity/email/:id/
GET
SMS activity
https://app.geniziz.com/api/v1/activity/sms/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
POST
SMS activity
https://app.geniziz.com/api/v1/activity/sms/
Request body (JSON)
{
}
GET
Get activity
https://app.geniziz.com/api/v1/activity/sms/:id/?_fields=
Query parameters
| _fields | Comma-separated fields to return. |
PUT
Update activity
https://app.geniziz.com/api/v1/activity/sms/:id/
Request body (JSON)
{
}
DELETE
Delete activity
https://app.geniziz.com/api/v1/activity/sms/:id/
GET
Emailthread activity
https://app.geniziz.com/api/v1/activity/emailthread/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
GET
Get activity
https://app.geniziz.com/api/v1/activity/emailthread/:id/?_fields=
Query parameters
| _fields | Comma-separated fields to return. |
GET
Meeting activity
https://app.geniziz.com/api/v1/activity/meeting/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
POST
Meeting activity
https://app.geniziz.com/api/v1/activity/meeting/
Request body (JSON)
{
}
GET
Get activity
https://app.geniziz.com/api/v1/activity/meeting/:id/?_fields=
Query parameters
| _fields | Comma-separated fields to return. |
PUT
Update activity
https://app.geniziz.com/api/v1/activity/meeting/:id/
Request body (JSON)
{
}
DELETE
Delete activity
https://app.geniziz.com/api/v1/activity/meeting/:id/
AI
POST
Summarize lead ai
https://app.geniziz.com/api/v1/ai/summarize_lead/
Request body (JSON)
{
}
POST
Draft email ai
https://app.geniziz.com/api/v1/ai/draft_email/
Request body (JSON)
{
}
POST
Summarize conversation ai
https://app.geniziz.com/api/v1/ai/summarize_conversation/
Request body (JSON)
{
}
POST
Score lead ai
https://app.geniziz.com/api/v1/ai/score_lead/
Request body (JSON)
{
}
POST
Generate icp rubric ai
https://app.geniziz.com/api/v1/ai/generate_icp_rubric/
Generate a structured, validated ICP scoring rubric from a plain-English
description. Returns the rubric; persist it via PUT /organization/
settings.icp.rubric to make scoring use it.
Request body (JSON)
{
}
POST
Suggest opportunity ai
https://app.geniziz.com/api/v1/ai/suggest_opportunity/
Request body (JSON)
{
}
POST
Search ai
https://app.geniziz.com/api/v1/ai/search/
Request body (JSON)
{
}
POST
Extract tasks ai
https://app.geniziz.com/api/v1/ai/extract_tasks/
Request body (JSON)
{
}
Conversation
GET
List conversations
https://app.geniziz.com/api/v1/conversation/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
POST
Create conversation
https://app.geniziz.com/api/v1/conversation/
Request body (JSON)
{
}
GET
Get conversation
https://app.geniziz.com/api/v1/conversation/:id/?_fields=
Query parameters
| _fields | Comma-separated fields to return. |
PUT
Update conversation
https://app.geniziz.com/api/v1/conversation/:id/
Request body (JSON)
{
}
DELETE
Delete conversation
https://app.geniziz.com/api/v1/conversation/:id/
Soft delete: hide the thread but keep its messages attached.
POST
Restore conversation
https://app.geniziz.com/api/v1/conversation/:id/restore/
POST /conversation/{id}/restore/ — undo a soft delete.
Request body (JSON)
{
}
POST
Message conversation
https://app.geniziz.com/api/v1/conversation/:id/message/
POST /conversation/{id}/message/ — add a message into the thread.
{type: note|email|sms, ...} — emails/SMS run through the real message
state machine (draft by default; "outbox" sends); recipients default
to the conversation's contact.
Request body (JSON)
{
}
File
GET
List files
https://app.geniziz.com/api/v1/file/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
Example response 200
{
"data": [
{
"id": "file_3c4d5e6f7g8h9i0j1k2l3m",
"lead_id": "lead_2x9Qb1c3d4e5f6g7h8i9j0",
"contact_id": "cont_7h8i9j0k1l2m3n4o5p6q7r",
"opportunity_id": null,
"name": "acme-proposal.pdf",
"mime": "application/pdf",
"size": 184320,
"type": "pdf",
"subtype": "proposal",
"subtype_label": "Proposal",
"outreach_channel": "email",
"scope": null,
"is_system": false,
"share_url": "https://app.geniziz.com/f/file_3c4d5e6f7g8h9i0j1k2l3m.9f1c0b7a2e4d6f8a0b2c4d6e/",
"share_url_base64": "https://app.geniziz.com/f/file_3c4d5e6f7g8h9i0j1k2l3m.9f1c0b7a2e4d6f8a0b2c4d6e/?format=base64",
"created_by": "user_0a1b2c3d4e5f6g7h8i9j0k",
"date_created": "2026-01-15T09:34:00.000Z",
"date_updated": "2026-01-15T09:34:00.000Z"
}
],
"has_more": false
}
POST
Create file
https://app.geniziz.com/api/v1/file/
Upload a file. Three ways to supply the bytes: a multipart form with a
`file` field, a JSON body with `content_base64`, or a JSON body with
`content_url` — a public http(s) URL the server fetches (private and
reserved addresses are refused; 20 MB limit either way). With
content_url, `name` and `mime` default to what the response declares.
Attach with `lead_id` (plus optional `contact_id`/`opportunity_id`
belonging to that lead), or omit ids to store a workspace asset.
Classify at upload with `type`, `subtype`, and `outreach_channel`.
Request body (JSON)
{
"name": "acme-proposal.pdf",
"mime": "application/pdf",
"content_base64": "JVBERi0xLjQKJcfsj6IKNSAwIG9iago8PC9MZW5ndGgg…",
"lead_id": "lead_2x9Qb1c3d4e5f6g7h8i9j0",
"contact_id": "cont_7h8i9j0k1l2m3n4o5p6q7r",
"subtype": "proposal",
"outreach_channel": "email"
}
Example response 201
{
"id": "file_3c4d5e6f7g8h9i0j1k2l3m",
"lead_id": "lead_2x9Qb1c3d4e5f6g7h8i9j0",
"contact_id": "cont_7h8i9j0k1l2m3n4o5p6q7r",
"opportunity_id": null,
"name": "acme-proposal.pdf",
"mime": "application/pdf",
"size": 184320,
"type": "pdf",
"subtype": "proposal",
"subtype_label": "Proposal",
"outreach_channel": "email",
"scope": null,
"is_system": false,
"share_url": "https://app.geniziz.com/f/file_3c4d5e6f7g8h9i0j1k2l3m.9f1c0b7a2e4d6f8a0b2c4d6e/",
"share_url_base64": "https://app.geniziz.com/f/file_3c4d5e6f7g8h9i0j1k2l3m.9f1c0b7a2e4d6f8a0b2c4d6e/?format=base64",
"created_by": "user_0a1b2c3d4e5f6g7h8i9j0k",
"date_created": "2026-01-15T09:34:00.000Z",
"date_updated": "2026-01-15T09:34:00.000Z"
}
GET
Resolve file
https://app.geniziz.com/api/v1/file/resolve/?_limit=100&_skip=0&_fields=
The one file to send to this record over this channel: the contact's own
assignment, else the lead's, else the workspace default. The whole point
of the channel slot — an agent gets a single answer instead of a list it
has to guess from.
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
Example response 200
{
"scope": "contact",
"id": "file_3c4d5e6f7g8h9i0j1k2l3m",
"lead_id": "lead_2x9Qb1c3d4e5f6g7h8i9j0",
"contact_id": "cont_7h8i9j0k1l2m3n4o5p6q7r",
"opportunity_id": null,
"name": "acme-proposal.pdf",
"mime": "application/pdf",
"size": 184320,
"type": "pdf",
"subtype": "proposal",
"subtype_label": "Proposal",
"outreach_channel": "email",
"is_system": false,
"share_url": "https://app.geniziz.com/f/file_3c4d5e6f7g8h9i0j1k2l3m.9f1c0b7a2e4d6f8a0b2c4d6e/",
"share_url_base64": "https://app.geniziz.com/f/file_3c4d5e6f7g8h9i0j1k2l3m.9f1c0b7a2e4d6f8a0b2c4d6e/?format=base64",
"created_by": "user_0a1b2c3d4e5f6g7h8i9j0k",
"date_created": "2026-01-15T09:34:00.000Z",
"date_updated": "2026-01-15T09:34:00.000Z"
}
GET
Get file
https://app.geniziz.com/api/v1/file/:id/?_fields=
Query parameters
| _fields | Comma-separated fields to return. |
Example response 200
{
"id": "file_3c4d5e6f7g8h9i0j1k2l3m",
"lead_id": "lead_2x9Qb1c3d4e5f6g7h8i9j0",
"contact_id": "cont_7h8i9j0k1l2m3n4o5p6q7r",
"opportunity_id": null,
"name": "acme-proposal.pdf",
"mime": "application/pdf",
"size": 184320,
"type": "pdf",
"subtype": "proposal",
"subtype_label": "Proposal",
"outreach_channel": "email",
"scope": null,
"is_system": false,
"share_url": "https://app.geniziz.com/f/file_3c4d5e6f7g8h9i0j1k2l3m.9f1c0b7a2e4d6f8a0b2c4d6e/",
"share_url_base64": "https://app.geniziz.com/f/file_3c4d5e6f7g8h9i0j1k2l3m.9f1c0b7a2e4d6f8a0b2c4d6e/?format=base64",
"created_by": "user_0a1b2c3d4e5f6g7h8i9j0k",
"date_created": "2026-01-15T09:34:00.000Z",
"date_updated": "2026-01-15T09:34:00.000Z"
}
GET
Download file
https://app.geniziz.com/api/v1/file/:id/download/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
PUT
Update file
https://app.geniziz.com/api/v1/file/:id/
Metadata-only edit: classify a file after the fact, or hand it an
outreach slot. Never touches the bytes — re-upload for that.
Request body (JSON)
{
"type": "pdf",
"subtype": "proposal",
"outreach_channel": "email"
}
Example response 200
{
"id": "file_3c4d5e6f7g8h9i0j1k2l3m",
"lead_id": "lead_2x9Qb1c3d4e5f6g7h8i9j0",
"contact_id": "cont_7h8i9j0k1l2m3n4o5p6q7r",
"opportunity_id": null,
"name": "acme-proposal.pdf",
"mime": "application/pdf",
"size": 184320,
"type": "pdf",
"subtype": "proposal",
"subtype_label": "Proposal",
"outreach_channel": "email",
"scope": null,
"is_system": false,
"share_url": "https://app.geniziz.com/f/file_3c4d5e6f7g8h9i0j1k2l3m.9f1c0b7a2e4d6f8a0b2c4d6e/",
"share_url_base64": "https://app.geniziz.com/f/file_3c4d5e6f7g8h9i0j1k2l3m.9f1c0b7a2e4d6f8a0b2c4d6e/?format=base64",
"created_by": "user_0a1b2c3d4e5f6g7h8i9j0k",
"date_created": "2026-01-15T09:34:00.000Z",
"date_updated": "2026-01-15T09:34:00.000Z"
}
DELETE
Delete file
https://app.geniziz.com/api/v1/file/:id/
Lead
GET
List leads
https://app.geniziz.com/api/v1/lead/?_limit=100&_skip=0&_fields=
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
Example response 200
{
"data": [
{
"id": "lead_2x9Qb1c3d4e5f6g7h8i9j0",
"name": "Acme Inc",
"url": "https://acme.example",
"status_id": "stat_1a2b3c4d5e6f7g8h9i0j1k",
"emails": [
{
"email": "hello@acme.example",
"type": "office"
}
],
"phones": [
{
"phone": "+15551234567",
"type": "office"
}
],
"mrr": 4900,
"date_created": "2026-01-15T09:30:00.000Z",
"date_updated": "2026-01-15T09:30:00.000Z"
}
],
"has_more": false
}
POST
Create lead
https://app.geniziz.com/api/v1/lead/
Request body (JSON)
{
"name": "Acme Inc",
"url": "https://acme.example",
"industry": "Software",
"status_id": "stat_1a2b3c4d5e6f7g8h9i0j1k",
"owner_id": "user_0a1b2c3d4e5f6g7h8i9j0k",
"mrr": 4900,
"emails": [
{
"email": "hello@acme.example",
"type": "office"
}
],
"phones": [
{
"phone": "+15551234567",
"type": "office"
}
],
"addresses": [
{
"city": "Austin",
"country": "US"
}
]
}
Example response 201
{
"id": "lead_2x9Qb1c3d4e5f6g7h8i9j0",
"name": "Acme Inc",
"url": "https://acme.example",
"status_id": "stat_1a2b3c4d5e6f7g8h9i0j1k",
"emails": [
{
"email": "hello@acme.example",
"type": "office"
}
],
"phones": [
{
"phone": "+15551234567",
"type": "office"
}
],
"mrr": 4900,
"date_created": "2026-01-15T09:30:00.000Z",
"date_updated": "2026-01-15T09:30:00.000Z"
}
POST
Merge lead
https://app.geniziz.com/api/v1/lead/merge/
POST /lead/merge/ {source, destination}: children move to the
destination, the source lead is deleted.
Request body (JSON)
{
}
POST
Move lead
https://app.geniziz.com/api/v1/lead/:id/move/
POST /lead/{id}/move/ {target_organization_id}: move a lead and all
its records into another workspace the caller administers. Org-scoped
references that don't exist in the target are remapped to defaults
(lead/opportunity status) or cleared (owner, assignee, custom fields),
so the lead lands valid. The caller must be an admin of both
workspaces.
Request body (JSON)
{
}
GET
Get lead
https://app.geniziz.com/api/v1/lead/:id/?_fields=
Query parameters
| _fields | Comma-separated fields to return. |
Example response 200
{
"id": "lead_2x9Qb1c3d4e5f6g7h8i9j0",
"name": "Acme Inc",
"url": "https://acme.example",
"status_id": "stat_1a2b3c4d5e6f7g8h9i0j1k",
"emails": [
{
"email": "hello@acme.example",
"type": "office"
}
],
"phones": [
{
"phone": "+15551234567",
"type": "office"
}
],
"mrr": 4900,
"date_created": "2026-01-15T09:30:00.000Z",
"date_updated": "2026-01-15T09:30:00.000Z"
}
PUT
Update lead
https://app.geniziz.com/api/v1/lead/:id/
Request body (JSON)
{
"name": "Acme Incorporated",
"status_id": "stat_won0000000000000000000"
}
Example response 200
{
"name": "Acme Incorporated",
"id": "lead_2x9Qb1c3d4e5f6g7h8i9j0",
"url": "https://acme.example",
"status_id": "stat_1a2b3c4d5e6f7g8h9i0j1k",
"emails": [
{
"email": "hello@acme.example",
"type": "office"
}
],
"phones": [
{
"phone": "+15551234567",
"type": "office"
}
],
"mrr": 4900,
"date_created": "2026-01-15T09:30:00.000Z",
"date_updated": "2026-01-15T09:30:00.000Z"
}
DELETE
Delete lead
https://app.geniziz.com/api/v1/lead/:id/
POST
Enrich lead
https://app.geniziz.com/api/v1/lead/:id/enrich/
POST /lead/{id}/enrich/ — the lead-level pass, with or without contacts.
The website/AI/logo work never needed a contact; it only ever ran as a
preflight inside a contact job, which is why a lead with no contacts could
not be enriched at all. When contacts DO exist the worker still runs the
contact waterfall afterwards, so this is a superset of the old behaviour
rather than a second path beside it.
Request body (JSON)
{
}
Report
GET
Activity report
https://app.geniziz.com/api/v1/report/activity/?_limit=100&_skip=0&_fields=
GET /report/activity/ — the metrics catalog.
Query parameters
| _limit | Page size (max 200). · e.g. 100 |
| _skip | Offset for pagination. |
| _fields | Comma-separated fields to return. |
POST
Activity report
https://app.geniziz.com/api/v1/report/activity/
POST /report/activity/ — per-user activity metrics for a period.
Request body (JSON)
{
}
POST
Funnel report
https://app.geniziz.com/api/v1/report/funnel/
POST /report/funnel/ — pipeline totals by status (+ won in period).
Request body (JSON)
{
}
POST
Calls funnel report
https://app.geniziz.com/api/v1/report/calls_funnel/
POST /report/calls_funnel/ — call volume, outcomes, and connect funnel.
Request body (JSON)
{
}
POST
Opportunity funnels report
https://app.geniziz.com/api/v1/report/opportunity_funnels/
POST /report/opportunity_funnels/ — stage funnel per pipeline.
Request body (JSON)
{
}
POST
Sales report
https://app.geniziz.com/api/v1/report/sales/
POST /report/sales/ — won revenue by month, stage conversion,
forecast by expected close month, per-rep leaderboard, and workflow
performance, in one payload (feeds the dashboard and reports page).
Request body (JSON)
{
}
POST
Lead report
https://app.geniziz.com/api/v1/report/status_change/lead/
Request body (JSON)
{
}
POST
Opportunity report
https://app.geniziz.com/api/v1/report/status_change/opportunity/
Request body (JSON)
{
}
POST
Sent emails report
https://app.geniziz.com/api/v1/report/sent_emails/
POST /report/sent_emails/ — per-template performance.
Request body (JSON)
{
}