Skip to main content

Products, Tax Rates & Billing Profile

Your catalogue of billable items, the named tax rates applied to them, and the billing profile that drives numbering and tax mode on quotes and invoices.

Overview

Three small resources sit behind quotes and invoices:

  • Products are reusable line items with a price, unit and optional tax rate.
  • Tax rates are named percentages you define, such as "GST 18%" or "VAT 20%".
  • The billing profile is your seller identity (legal name, address, tax ID) plus numbering and default terms. There is exactly one per account.

Authentication

Authorization: Bearer cm_your_api_key
OperationScope
Read products and tax ratescrm_products:read
Create, update, delete products and tax ratescrm_products:write
Read the billing profilecrm_billing:read
Replace the billing profilecrm_billing:write

One scope pair covers both products and tax rates. Dashboard logins are not scope-checked, except that creating, updating or deleting tax rates and replacing the billing profile require an owner or admin role.

Money and rates

  • Money is always an integer in minor units of the document's currency, never a decimal. INR 1180.50 is 118050. Currencies with no minor unit (for example JPY) use exponent 0; a few (for example KWD) use exponent 3; everything else uses 2.
  • Tax rates are in basis points (1 bps = 0.01%). 1800 is 18%. Allowed range 0..10000.

Products

{
  "id": "8b20…",
  "tenant_id": "a0b1…",
  "name": "Voice agent setup",
  "description": "One-time onboarding",
  "sku": "VA-SETUP",
  "unit": "unit",
  "unit_price_minor": 2500000,
  "currency": "INR",
  "tax_rate_id": "9c30…",
  "hsn_sac": "998313",
  "archived": false,
  "created_at": "2026-10-07T09:00:00Z",
  "updated_at": "2026-10-07T09:00:00Z"
}
MethodPathNotes
GET/api/v1/crm/productsq (up to 255 characters; case-insensitive name or SKU substring), results ordered by name, include_archived (default false), limit 1..200 (default 50), offset 0..100000
POST/api/v1/crm/products201
GET/api/v1/crm/products/{product_id}
PATCH/api/v1/crm/products/{product_id}Any create field plus archived, all optional. A null unit, unit_price_minor, currency or archived is ignored; a blank name is 422
DELETE/api/v1/crm/products/{product_id}204. Archives the product if any quote or invoice line references it; otherwise deletes it

POST /api/v1/crm/products

FieldTypeRequiredConstraints
namestringYes1–255 characters, not blank
descriptionstringNoUp to 5000 characters
skustringNoUp to 64 characters, unique per tenant when set (409 otherwise)
unitstringNo1–32 characters, default unit
unit_price_minorintegerNo0 to 10^15, default 0
currencystringNoExactly 3 letters (upper-cased). Defaults to your billing profile's default_currency
tax_rate_idUUIDNoMust be your tax rate (404 otherwise)
hsn_sacstringNoUp to 16 characters. HSN (goods) or SAC (services) code, used on Indian GST documents
curl -X POST https://api.callmissed.com/api/v1/crm/products \
  -H "Authorization: Bearer cm_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Voice agent setup",
    "sku": "VA-SETUP",
    "unit_price_minor": 2500000,
    "currency": "INR",
    "tax_rate_id": "9c30…",
    "hsn_sac": "998313"
  }'

Create returns 201 with the product object. Archived products stay on existing documents but are hidden from the default list.


Tax rates

{
  "id": "9c30…",
  "tenant_id": "a0b1…",
  "name": "GST 18%",
  "rate_bps": 1800,
  "is_default": true,
  "archived": false,
  "created_at": "2026-10-07T09:00:00Z",
  "updated_at": "2026-10-07T09:00:00Z"
}
MethodPathNotes
GET/api/v1/crm/tax-ratesinclude_archived (default false), limit 1..200 (default 50), offset 0..100000. Ordered by rate_bps, then name
POST/api/v1/crm/tax-rates201. name 1–64 characters, unique per tenant (409). rate_bps 0..10000, required. is_default default false
PATCH/api/v1/crm/tax-rates/{rate_id}name, rate_bps, is_default, archived, all optional. A null rate_bps, is_default or archived is ignored
DELETE/api/v1/crm/tax-rates/{rate_id}204. Archives the rate (and clears its default flag) rather than removing it, so existing documents keep their history

Only one rate is the default: setting is_default on one clears it on the others, and archiving a rate clears its default flag. Writes need an owner or admin role for dashboard logins. Changing a rate does not rewrite existing quotes or invoices. Each line stores the tax name and rate it was created with.


Billing profile

One profile per account. GET creates the profile with defaults on first read if you have not saved one yet.

{
  "id": "1d40…",
  "tenant_id": "a0b1…",
  "legal_name": "Acme Traders Pvt Ltd",
  "address_line1": "12 MG Road",
  "address_line2": null,
  "city": "Pune",
  "state": "Maharashtra",
  "state_code": "27",
  "postal_code": "411001",
  "country": "IN",
  "tax_id": "27ABCDE1234F1Z5",
  "tax_regime": "in_gst",
  "default_currency": "INR",
  "invoice_prefix": "INV",
  "quote_prefix": "QT",
  "numbering_period": "fy_april",
  "payment_terms_days": 15,
  "quote_validity_days": 30,
  "default_notes": null,
  "default_terms": "Payment due within 15 days.",
  "bank_details": "Account name, number, IFSC",
  "reply_to_email": "billing@acme.example",
  "auto_invoice_on_accept": true,
  "created_at": "2026-10-07T09:00:00Z",
  "updated_at": "2026-10-07T09:00:00Z"
}
MethodPath
GET/api/v1/crm/billing-profile
PUT/api/v1/crm/billing-profile

PUT replaces the whole profile: every field is optional, but an omitted field is reset to its default (null for text fields). With an API key it needs crm_billing:write; with a dashboard login only an owner or admin may change it (403 otherwise). Returns the saved profile.

FieldTypeConstraints
legal_namestringUp to 255 characters
address_line1, address_line2stringUp to 255 characters each
city, statestringUp to 120 characters each
state_codestringUp to 4 characters. For India, the 2-digit GST state code
postal_codestringUp to 20 characters
countrystringExactly 2 letters (upper-cased), ISO 3166, default IN
tax_idstringUp to 32 characters. GSTIN, VAT number or equivalent
tax_regimestringin_gst, standard or none. Default in_gst. See below
default_currencystringExactly 3 letters (upper-cased), ISO 4217, default INR
invoice_prefix, quote_prefixstring1–5 characters: letters, digits and - only. Defaults INV and QT
numbering_periodstringfy_april, calendar or none. Default fy_april
payment_terms_daysinteger0..365, default 15. Sets the invoice due date
quote_validity_daysinteger1..365, default 30. Sets the quote valid_until
default_notes, default_termsstringUp to 5000 characters each. Copied onto new documents
bank_detailsstringUp to 2000 characters. Copied onto new documents
reply_to_emailstringUp to 320 characters, must be a valid-looking email address. Replies to documents you send go here
auto_invoice_on_acceptbooleanDefault true. See quotes

Tax regimes

tax_regimeEffect
in_gstIndian GST. If the buyer's state code matches yours the tax is split into CGST and SGST (half each); otherwise it is a single IGST line. A buyer outside India is treated as inter-state
standardOne named tax row per rate, such as "VAT 20%". No country rules are applied
noneAll line tax is forced to 0

The mode is resolved for you from the seller and buyer details and saved on each document as tax_mode (in_intra, in_inter, standard or none) with a place_of_supply. CallMissed does not look up rates for you: tax is calculated from the rates you configure. For tax treatment, such as zero-rating exports, consult your tax advisor.

Numbering

Document numbers look like INV/26-27/0001: prefix, period, then a gapless counter that restarts each period.

numbering_periodPeriod segment
fy_aprilFinancial year starting 1 April, such as 26-27
calendarCalendar year, such as 2026
noneNo period segment, such as INV/0001

Quotes are numbered when first sent. Invoices are numbered when issued, so drafts never consume a number.


Errors

StatusWhen
403Key is missing the scope, or a dashboard user who is not an owner or admin creates, updates or deletes tax rates or replaces the billing profile
404Product, tax rate or referenced tax rate not in your tenant
409Duplicate SKU or tax rate name
422Blank name, rate_bps outside 0..10000, unknown tax_regime or numbering_period, an invalid country, currency, prefix or reply_to_email, or a value outside the bounds above

Nothing on this page consumes credits.