The Zerosoft API.
Zero friction.

All products expose the same style of API: REST, JSON and personal keys. If the dashboard can do it, your code can do it.

Base URL

https://zerosoft.ai/api/v1

Authentication

Every request needs an API key, sent as a Bearer token. For browser sessions the Google OAuth flow creates the session cookie.

Authorization: Bearer zs_live_9f3k...

Create keys in Dashboard → Settings → API keys. A key is shown exactly once — copy it and store it like a password. Each key allows 100 requests per minute.

Google OAuth sign-in

GET/api/auth/signin/google

Redirect the user to start the Google OAuth flow. After success they return to the app with a session cookie.

curl -X GET "https://zerosoft.ai/api/auth/signin/google" \
  -H "Authorization: Bearer zs_live_9f3k..."

CRM — Contacts

People and leads.

List contacts

GET/api/v1/crm/contacts

List contacts. Filters: q, page, pageSize (max 100).

NameTypeRequiredDescription
qstringNoSearch query.
pageintegerNoPage number.
pageSizeintegerNoItems per page (max 100).
curl -X GET "https://zerosoft.ai/api/v1/crm/contacts" \
  -H "Authorization: Bearer zs_live_9f3k..."

Response · 200

{
  "rows": [
    {
      "id": "b1f47ac2-…",
      "first_name": "Ana",
      "last_name": "Garcia",
      "email": "ana@kallpa.co",
      "lifecycle_stage": "sql",
      "created_at": "2026-07-18 10:04:11"
    }
  ],
  "total": 142,
  "page": 1,
  "pageSize": 10
}

Create a contact

POST/api/v1/crm/contacts

Create a new contact.

NameTypeRequiredDescription
first_namestringNoFirst name.
last_namestringNoLast name.
emailstringNoEmail address.
lifecycle_stagestringNoLifecycle stage (lead, sql, opportunity, customer).
curl -X POST "https://zerosoft.ai/api/v1/crm/contacts" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "first_name": "Ana",
  "last_name": "Garcia",
  "email": "ana@kallpa.co",
  "lifecycle_stage": "sql"
}'

Request

{
  "first_name": "Ana",
  "last_name": "Garcia",
  "email": "ana@kallpa.co",
  "lifecycle_stage": "sql"
}

Response · 201

{
  "id": "b1f47ac2-…",
  "first_name": "Ana",
  "last_name": "Garcia",
  "email": "ana@kallpa.co",
  "lifecycle_stage": "sql",
  "created_at": "2026-07-18 10:04:11"
}

Get a contact

GET/api/v1/crm/contacts/{id}

Read one contact by id.

NameTypeRequiredDescription
idstringYesRecord id.
curl -X GET "https://zerosoft.ai/api/v1/crm/contacts/{id}" \
  -H "Authorization: Bearer zs_live_9f3k..."

Update a contact

PATCH/api/v1/crm/contacts/{id}

Update any property of a contact.

NameTypeRequiredDescription
idstringYesRecord id.
first_namestringNoFirst name.
last_namestringNoLast name.
emailstringNoEmail address.
curl -X PATCH "https://zerosoft.ai/api/v1/crm/contacts/{id}" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "lifecycle_stage": "opportunity"
}'

Request

{
  "lifecycle_stage": "opportunity"
}

CRM — Companies

Organizations and accounts.

List companies

GET/api/v1/crm/companies

List companies. Filters: q, page, pageSize.

NameTypeRequiredDescription
qstringNoSearch query.
pageintegerNoPage number.
pageSizeintegerNoItems per page (max 100).
curl -X GET "https://zerosoft.ai/api/v1/crm/companies" \
  -H "Authorization: Bearer zs_live_9f3k..."

Create a company

POST/api/v1/crm/companies

Create a new company.

NameTypeRequiredDescription
namestringYesCompany name.
domainstringNoDomain name.
industrystringNoIndustry.
curl -X POST "https://zerosoft.ai/api/v1/crm/companies" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "name": "Norte Labs",
  "domain": "nortelabs.co",
  "industry": "Software"
}'

Request

{
  "name": "Norte Labs",
  "domain": "nortelabs.co",
  "industry": "Software"
}

Get a company

GET/api/v1/crm/companies/{id}

Read one company by id.

NameTypeRequiredDescription
idstringYesRecord id.
curl -X GET "https://zerosoft.ai/api/v1/crm/companies/{id}" \
  -H "Authorization: Bearer zs_live_9f3k..."

Update a company

PATCH/api/v1/crm/companies/{id}

Update any property of a company.

NameTypeRequiredDescription
idstringYesRecord id.
namestringNoCompany name.
domainstringNoDomain name.
curl -X PATCH "https://zerosoft.ai/api/v1/crm/companies/{id}" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "industry": "Cloud infrastructure"
}'

Request

{
  "industry": "Cloud infrastructure"
}

CRM — Deals

Opportunities and pipelines.

List deals

GET/api/v1/crm/deals

List deals. Filter: pipelineId.

NameTypeRequiredDescription
pipelineIdstringNoPipeline id.
qstringNoSearch query.
pageintegerNoPage number.
pageSizeintegerNoItems per page (max 100).
curl -X GET "https://zerosoft.ai/api/v1/crm/deals" \
  -H "Authorization: Bearer zs_live_9f3k..."

Create a deal

POST/api/v1/crm/deals

Create a deal in a pipeline stage.

NameTypeRequiredDescription
namestringYesDeal name.
amountnumberNoDeal amount.
currencystringNoCurrency code.
stage_idstringYesStage id.
curl -X POST "https://zerosoft.ai/api/v1/crm/deals" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "name": "Norte Labs — New business",
  "amount": 24000,
  "currency": "USD",
  "stage_id": "{stage_id}"
}'

Request

{
  "name": "Norte Labs — New business",
  "amount": 24000,
  "currency": "USD",
  "stage_id": "{stage_id}"
}

Get a deal

GET/api/v1/crm/deals/{id}

Read one deal by id.

NameTypeRequiredDescription
idstringYesRecord id.
curl -X GET "https://zerosoft.ai/api/v1/crm/deals/{id}" \
  -H "Authorization: Bearer zs_live_9f3k..."

Update a deal

PATCH/api/v1/crm/deals/{id}

Update amount, stage or dates.

NameTypeRequiredDescription
idstringYesRecord id.
namestringNoDeal name.
amountnumberNoDeal amount.
stage_idstringNoStage id.
curl -X PATCH "https://zerosoft.ai/api/v1/crm/deals/{id}" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "amount": 28000
}'

Request

{
  "amount": 28000
}

CRM — Tasks

Activities and follow-ups.

List tasks

GET/api/v1/crm/tasks

List tasks. bucket: overdue, today, upcoming, done.

NameTypeRequiredDescription
bucketstringNoFilter bucket: overdue, today, upcoming, done.
pageintegerNoPage number.
pageSizeintegerNoItems per page (max 100).
curl -X GET "https://zerosoft.ai/api/v1/crm/tasks" \
  -H "Authorization: Bearer zs_live_9f3k..."

Create a task

POST/api/v1/crm/tasks

Create a task, optionally linked to a record.

NameTypeRequiredDescription
subjectstringYesTask subject.
due_atstring (ISO)NoDue date in ISO format.
contact_idstringNoLinked contact id.
company_idstringNoLinked company id.
deal_idstringNoLinked deal id.
curl -X POST "https://zerosoft.ai/api/v1/crm/tasks" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "subject": "Follow-up call",
  "due_at": "2026-07-25T15:00:00Z",
  "deal_id": "{deal_id}"
}'

Request

{
  "subject": "Follow-up call",
  "due_at": "2026-07-25T15:00:00Z",
  "deal_id": "{deal_id}"
}

Update a task

PATCH/api/v1/crm/tasks/{id}

Edit or complete a task.

NameTypeRequiredDescription
idstringYesRecord id.
subjectstringNoTask subject.
donebooleanNoMark as done.
curl -X PATCH "https://zerosoft.ai/api/v1/crm/tasks/{id}" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "done": true
}'

Request

{
  "done": true
}

CRM — Pipelines & stages

Sales pipelines and their stages.

List pipelines

GET/api/crm/pipelines

List pipelines with their stages.

curl -X GET "https://zerosoft.ai/api/crm/pipelines" \
  -H "Authorization: Bearer zs_live_9f3k..."

Create a pipeline

POST/api/crm/pipelines

Create a new pipeline.

NameTypeRequiredDescription
namestringYesPipeline name.
curl -X POST "https://zerosoft.ai/api/crm/pipelines" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sales"
}'

Request

{
  "name": "Sales"
}

List stages

GET/api/crm/pipelines/{id}/stages

List stages of a pipeline.

NameTypeRequiredDescription
idstringYesPipeline id.
curl -X GET "https://zerosoft.ai/api/crm/pipelines/{id}/stages" \
  -H "Authorization: Bearer zs_live_9f3k..."

Create a stage

POST/api/crm/pipelines/{id}/stages

Create a stage inside a pipeline.

NameTypeRequiredDescription
idstringYesPipeline id.
namestringYesStage name.
probabilityintegerNoWin probability (0-100).
curl -X POST "https://zerosoft.ai/api/crm/pipelines/{id}/stages" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "name": "Proposal",
  "probability": 50
}'

Request

{
  "name": "Proposal",
  "probability": 50
}

Teams

Invite, accept and switch workspaces.

Invite to team

POST/api/teams/invites

Invite an email to join a team.

NameTypeRequiredDescription
teamIdstringYesTeam id.
emailstringYesEmail to invite.
curl -X POST "https://zerosoft.ai/api/teams/invites" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "teamId": "{team_id}",
  "email": "teammate@company.com"
}'

Request

{
  "teamId": "{team_id}",
  "email": "teammate@company.com"
}

Response · 201

{
  "invite": {
    "id": "inv_…",
    "token": "…"
  },
  "url": "https://zerosoft.ai/en/invite/…"
}

Accept invite

POST/api/teams/accept

Accept an invite by token.

NameTypeRequiredDescription
tokenstringYesInvite token.
curl -X POST "https://zerosoft.ai/api/teams/accept" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "token": "{invite_token}"
}'

Request

{
  "token": "{invite_token}"
}

Response · 200

{
  "ok": true,
  "team": {
    "id": "{team_id}",
    "name": "Norte Labs"
  }
}

Switch team

POST/api/teams/switch

Switch active workspace. Use teamId: null for the personal workspace.

NameTypeRequiredDescription
teamIdstring | nullNoTeam id or null for the personal workspace.
curl -X POST "https://zerosoft.ai/api/teams/switch" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "teamId": "{team_id}"
}'

Request

{
  "teamId": "{team_id}"
}

Response · 200

{
  "ok": true
}

Docs

Pages and wikis.

List pages

GET/api/docs/pages

List docs pages.

curl -X GET "https://zerosoft.ai/api/docs/pages" \
  -H "Authorization: Bearer zs_live_9f3k..."

Response · 200

{
  "rows": [
    {
      "id": "page_…",
      "title": "Wiki home",
      "parent_id": null,
      "updated_at": "2026-07-18T12:00:00Z"
    }
  ]
}

Create page

POST/api/docs/pages

Create a new docs page.

NameTypeRequiredDescription
titlestringYesPage title.
parent_idstringNoParent page id.
contentDocsBlock[]NoPage content blocks.
curl -X POST "https://zerosoft.ai/api/docs/pages" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "title": "Onboarding",
  "parent_id": null,
  "content": []
}'

Request

{
  "title": "Onboarding",
  "parent_id": null,
  "content": []
}

Get page

GET/api/docs/pages/{id}

Read one page by id.

NameTypeRequiredDescription
idstringYesPage id.
curl -X GET "https://zerosoft.ai/api/docs/pages/{id}" \
  -H "Authorization: Bearer zs_live_9f3k..."

Update page

PATCH/api/docs/pages/{id}

Update title, content or archive a page.

NameTypeRequiredDescription
idstringYesPage id.
titlestringNoPage title.
contentDocsBlock[]NoPage content blocks.
archivedbooleanNoArchive flag.
curl -X PATCH "https://zerosoft.ai/api/docs/pages/{id}" \
  -H "Authorization: Bearer zs_live_9f3k..."
  -H "Content-Type: application/json" \
  -d '{
  "title": "Onboarding v2"
}'

Request

{
  "title": "Onboarding v2"
}

Delete page

DELETE/api/docs/pages/{id}

Delete a page by id.

NameTypeRequiredDescription
idstringYesPage id.
curl -X DELETE "https://zerosoft.ai/api/docs/pages/{id}" \
  -H "Authorization: Bearer zs_live_9f3k..."

Response · 200

{
  "ok": true
}