Customers
The customer register (kundregister): the companies and private persons you quote, carry out work for and invoice. One register is shared by every module — the customer on a deal room, on a work order and on an invoice is the same record — so these endpoints need no module, only the member's customer permissions.
A customer carries its invoicing defaults (payment terms, delivery, currency, late-payment interest) and any number of addresses. Contacts and ROT/RUT tax profiles are shown on a single customer but are not managed here.
Syncing with an ERP or CRM: send your system's customer number as customer_number when you create the customer, and look customers up with q, which matches the customer number and the organisationsnummer as well as the name.
List customers
/customersCustomers in alphabetical order, with their addresses, one page at a time.
q is a case-insensitive contains match on the name, the customer number and the organisationsnummer, so 769612 finds Brf Solglantan and 1042 finds customer 1042. Filters combine with AND.
Paging is by cursor: pass meta.next_cursor back as cursor, together with the same q, filters and limit — the URLs in links do not carry your filters.
Contacts and tax profiles are only included when you fetch a single customer.
curl 'https://api.closepact.com/v1/api/customers' \
-H "Authorization: Bearer $CLOSEPACT_API_KEY"{
"data": [
{
"id": "01a15a20-3b7e-7f41-9d0c-2a6f4b8e1c55",
"name": "Brf Solglantan",
"customer_number": "1042",
"customer_type": "company",
"org_number": "769612-3456",
"vat_number": null,
"domain": "solglantan.se",
"industry": "Bostadsrättsförening",
"industry_code": "68203",
"country": "SE",
"invoicing": {
"payment_terms_days": 30,
"late_interest_percent": 10.5,
"vat_mode": "se",
"delivery": "email",
"peppol_id": null,
"reference": "Styrelsen / Karin Holm",
"reminder_email": "ekonomi@solglantan.se",
"currency": "SEK",
"credit_limit_cents": null,
"is_blocked": false
},
"locale": "sv",
"notes": "Portkod 4512. Trappstädning varannan tisdag.",
"sub_entity_id": null,
"addresses": [
{
"id": "01a15a20-3b9a-7a12-8f3e-5c1d7e9a2b64",
"organization_id": "01a14eb3-c5f0-7c55-8c2e-6a0e1f7b9d21",
"account_id": "01a15a20-3b7e-7f41-9d0c-2a6f4b8e1c55",
"type": "billing",
"label": "Fakturaadress",
"street": "Box 1123",
"street2": null,
"zip": "165 26",
"city": "Hässelby",
"country": "SE",
"lat": null,
"lng": null,
"geofence_radius_m": null,
"access_notes": null,
"contact_id": null,
"is_default": true,
"metadata": [],
"created_at": "2026-09-02T08:14:11.000000Z",
"updated_at": "2026-09-02T08:14:11.000000Z",
"deleted_at": null
}
],
"created_at": "2026-09-02T08:14:11+00:00",
"updated_at": "2026-10-01T12:40:03+00:00"
}
],
"links": {
"first": null,
"last": null,
"prev": null,
"next": "https://api.closepact.com/v1/api/customers?cursor=eyJuYW1lIjoiQnJmIFNvbGdsYW50YW4iLCJfcG9pbnRzVG9OZXh0SXRlbXMiOnRydWV9"
},
"meta": {
"path": "https://api.closepact.com/v1/api/customers",
"per_page": 25,
"next_cursor": "eyJuYW1lIjoiQnJmIFNvbGdsYW50YW4iLCJfcG9pbnRzVG9OZXh0SXRlbXMiOnRydWV9",
"prev_cursor": null
}
}Query parameters
qstringSearch the name, customer number and organisationsnummer.
Example
Solglantanfilter[customer_type]stringOnly companies, or only private persons.
One of
companyprivatefilter[blocked]booleantruefor customers your office has blocked from further invoicing,falsefor the rest.limitintegerCustomers per page.
Default
251–100cursorstringOpaque cursor from
meta.next_cursorormeta.prev_cursorof the previous page.
Responses
Headers
X-RateLimit-Limit— Requests this key may make per minute.X-RateLimit-Remaining— Requests left in the current minute.
dataarray of objectsrequiredidstring(uuid)requirednamestringrequiredcustomer_numberstringnullablerequiredKundnummer, unique in the organization. Assigned on creation unless you send one. Null only on old records that came in through a CRM sync.
customer_typestringrequiredRUT applies only to private persons; ROT to private persons who own the home.
One of
companyprivateorg_numberstringnullablerequiredOrganisationsnummer, e.g.
769612-3456. Empty for a private person.vat_numberstringnullablerequiredVAT registration number (momsregistreringsnummer), e.g.
SE769612345601. Needed on an EU or reverse-charge invoice.domainstringnullablerequiredindustrystringnullablerequiredindustry_codestringnullablerequiredSNI code.
countrystringnullablerequiredISO 3166-1 alpha-2.
invoicingobjectrequiredDefaults for the customer's invoices.
localestringrequiredThe language the customer's people are written to in — invoices, payment reminders, quotes and signing mails:
svoren. Any other value falls back to the organization's language, then Swedish.notesstringnullablerequiredsub_entity_idstring(uuid)nullablerequiredThe office or legal entity the customer belongs to, for organizations that run several. Customers are not hidden by it.
addressesarray of objectsrequiredcontactsarray of objectsOnly on
GET /customers/{account}.tax_profilesarray of objectsOnly on
GET /customers/{account}.created_atstring(date-time)requiredupdated_atstring(date-time)required
linksobjectrequiredmetaobjectrequired
- 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.Errors
- 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs:Errors
featurenames the capability (the operation'sx-feature) andrequired_tierthe cheapest tier that grants it. Every operation answers this with"feature": "core.api"when no module the organization holds is on a tier that includes the API. - 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (Errors
module_seat_required— an administrator assigns seats under Settings → Users), or the organization is suspended. - 429The key has made more requests this minute than its limit allows.Errors
Create a customer
/customerswrite Permission customers.createAdds a customer to the register. Only name is required; everything else falls back to the organization's defaults, which the response shows (30 days' payment terms, Swedish VAT, email delivery, SEK, Swedish).
Customer number. Leave customer_number out and the next free number in the organization's series is assigned (1001, 1002, …). When syncing from an ERP, send the ERP's number instead so both systems agree. It must be unique in the organization; unlike an invoice number it carries no legal weight and gaps do not matter.
Company or private person. customer_type decides which tax deductions can ever apply: RUT is for private persons, ROT for private persons who own the home (a villa, or a bostadsrätt through its BRF). For a private person leave org_number empty — a personnummer does not belong in a free-text field. What Skatteverket needs for a ROT/RUT claim lives in the customer's tax profiles, which store only a hash and the last four digits.
Addresses are added afterwards with POST /customers/{account}/addresses.
curl -X POST 'https://api.closepact.com/v1/api/customers' \
-H "Authorization: Bearer $CLOSEPACT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Brf Solglantan",
"customer_number": "1042",
"customer_type": "company",
"org_number": "769612-3456",
"country": "SE",
"payment_terms_days": 30,
"reminder_email": "ekonomi@solglantan.se",
"notes": "Portkod 4512. Trappstädning varannan tisdag."
}'{
"data": {
"id": "01a15a20-3b7e-7f41-9d0c-2a6f4b8e1c55",
"name": "Brf Solglantan",
"customer_number": "1042",
"customer_type": "company",
"org_number": "769612-3456",
"vat_number": null,
"domain": null,
"industry": null,
"industry_code": null,
"country": "SE",
"invoicing": {
"payment_terms_days": 30,
"late_interest_percent": null,
"vat_mode": "se",
"delivery": "email",
"peppol_id": null,
"reference": null,
"reminder_email": "ekonomi@solglantan.se",
"currency": "SEK",
"credit_limit_cents": null,
"is_blocked": false
},
"locale": "sv",
"notes": "Portkod 4512. Trappstädning varannan tisdag.",
"sub_entity_id": null,
"addresses": [],
"created_at": "2026-10-18T09:12:30+00:00",
"updated_at": "2026-10-18T09:12:30+00:00"
}
}Request body
application/json · required
The writable fields of a customer. On update every field is optional.
namestringrequiredat most 255 characters
customer_numberstringnullableLeave out on create to have the next number assigned. Must be unique in the organization, deleted customers included — a deleted customer keeps its number. A number already taken is a 422 on
customer_number.at most 32 characters
customer_typestringOne of
companyprivateDefault
"company"org_numberstringnullableat most 32 characters
vat_numberstringnullableat most 32 characters
domainstringnullableat most 255 characters
industrystringnullableat most 64 characters
industry_codestringnullableat most 16 characters
countrystringnullableexactly 2 characters
payment_terms_daysintegerDefault
300–365late_interest_percentnumbernullable0–100
vat_modestringOne of
sereverseeuexportDefault
"se"invoice_deliverystringReturned as
invoicing.delivery.One of
emailpeppolprintDefault
"email"peppol_idstringnullableat most 64 characters
einvoice_referencestringnullableReturned as
invoicing.reference.at most 64 characters
reminder_emailstring(email)nullableat most 320 characters
currencystringDefault
"SEK"exactly 3 characterslocalestringsvoren. Leave out on create to take the organization's language, which is Swedish unless the organization chose English.at most 8 characters
credit_limit_centsintegernullable≥ 0
is_blockedbooleanDefault
falsenotesstringnullablesub_entity_idstring(uuid)nullable
Responses
Headers
X-RateLimit-Limit— Requests this key may make per minute.X-RateLimit-Remaining— Requests left in the current minute.
dataobjectrequiredA customer in the register, shared by every module.
idstring(uuid)requirednamestringrequiredcustomer_numberstringnullablerequiredKundnummer, unique in the organization. Assigned on creation unless you send one. Null only on old records that came in through a CRM sync.
customer_typestringrequiredRUT applies only to private persons; ROT to private persons who own the home.
One of
companyprivateorg_numberstringnullablerequiredOrganisationsnummer, e.g.
769612-3456. Empty for a private person.vat_numberstringnullablerequiredVAT registration number (momsregistreringsnummer), e.g.
SE769612345601. Needed on an EU or reverse-charge invoice.domainstringnullablerequiredindustrystringnullablerequiredindustry_codestringnullablerequiredSNI code.
countrystringnullablerequiredISO 3166-1 alpha-2.
invoicingobjectrequiredDefaults for the customer's invoices.
localestringrequiredThe language the customer's people are written to in — invoices, payment reminders, quotes and signing mails:
svoren. Any other value falls back to the organization's language, then Swedish.notesstringnullablerequiredsub_entity_idstring(uuid)nullablerequiredThe office or legal entity the customer belongs to, for organizations that run several. Customers are not hidden by it.
addressesarray of objectsrequiredcontactsarray of objectsOnly on
GET /customers/{account}.tax_profilesarray of objectsOnly on
GET /customers/{account}.created_atstring(date-time)requiredupdated_atstring(date-time)required
- 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.Errors
- 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs:Errors
featurenames the capability (the operation'sx-feature) andrequired_tierthe cheapest tier that grants it. Every operation answers this with"feature": "core.api"when no module the organization holds is on a tier that includes the API. - 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (Errors
module_seat_required— an administrator assigns seats under Settings → Users), or the organization is suspended. - 422The request body or query failed validation.Errors
- 429The key has made more requests this minute than its limit allows.Errors
Get a customer
/customers/{account}One customer with its addresses, its contacts and its ROT/RUT tax profiles.
Tax profiles hold what a ROT or RUT claim needs: the buyer (only the last four digits of the personnummer are ever returned; the full number is stored as a hash), and for ROT the property — a property_designation (fastighetsbeteckning) for a house, or brf_org_number plus apartment_number (lägenhetsnummer) for a bostadsrätt. Two owners sharing a claim show up as a co-applicant and an applicant_share_percent. Closepact does not refuse to send a ROT/RUT invoice to a customer without one, so check here first if your integration creates such invoices.
Another organization's customer id answers 404.
curl 'https://api.closepact.com/v1/api/customers/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40' \
-H "Authorization: Bearer $CLOSEPACT_API_KEY"{
"data": {
"id": "01a15a21-0c44-7b19-8e2d-6f3a9c1b5d70",
"name": "Eva Ek",
"customer_number": "1043",
"customer_type": "private",
"org_number": null,
"vat_number": null,
"domain": null,
"industry": null,
"industry_code": null,
"country": "SE",
"invoicing": {
"payment_terms_days": 20,
"late_interest_percent": null,
"vat_mode": "se",
"delivery": "email",
"peppol_id": null,
"reference": null,
"reminder_email": null,
"currency": "SEK",
"credit_limit_cents": null,
"is_blocked": false
},
"locale": "sv",
"notes": null,
"sub_entity_id": null,
"addresses": [
{
"id": "01a15a21-0c61-7d02-a4b8-2e9f7c3a1d56",
"organization_id": "01a14eb3-c5f0-7c55-8c2e-6a0e1f7b9d21",
"account_id": "01a15a21-0c44-7b19-8e2d-6f3a9c1b5d70",
"type": "service",
"label": "Lägenhet 1101",
"street": "Solgläntans väg 12",
"street2": "4 tr",
"zip": "165 72",
"city": "Hässelby",
"country": "SE",
"lat": 59.3661,
"lng": 17.8329,
"geofence_radius_m": 75,
"access_notes": "Nyckel i nyckelbox vid porten, kod 1937.",
"contact_id": null,
"is_default": true,
"metadata": [],
"created_at": "2026-09-14T10:03:51.000000Z",
"updated_at": "2026-09-14T10:03:51.000000Z",
"deleted_at": null
}
],
"contacts": [
{
"id": "01a15a21-0c7a-70e4-9b3c-5d8a2f6e1c49",
"organization_id": "01a14eb3-c5f0-7c55-8c2e-6a0e1f7b9d21",
"account_id": "01a15a21-0c44-7b19-8e2d-6f3a9c1b5d70",
"email": "eva.ek@example.se",
"name": "Eva Ek",
"title": null,
"phone": "+46 70 123 45 67",
"crm_external_id": null,
"crm_provider": null,
"metadata": null,
"created_at": "2026-09-14T10:03:51.000000Z",
"updated_at": "2026-09-14T10:03:51.000000Z",
"deleted_at": null
}
],
"tax_profiles": [
{
"id": "01a15a21-0c93-7a58-b1e6-8c4d2f9a3e17",
"organization_id": "01a14eb3-c5f0-7c55-8c2e-6a0e1f7b9d21",
"account_id": "01a15a21-0c44-7b19-8e2d-6f3a9c1b5d70",
"address_id": "01a15a21-0c61-7d02-a4b8-2e9f7c3a1d56",
"label": "Bostadsrätt i Brf Solglantan",
"personal_number_last4": "1234",
"property_designation": null,
"apartment_number": "1101",
"brf_org_number": "769612-3456",
"co_applicant_name": null,
"co_applicant_personal_number_last4": null,
"applicant_share_percent": 100,
"created_at": "2026-09-14T10:05:12.000000Z",
"updated_at": "2026-09-14T10:05:12.000000Z",
"deleted_at": null
}
],
"created_at": "2026-09-14T10:03:51+00:00",
"updated_at": "2026-09-14T10:03:51+00:00"
}
}Path parameters
accountstring(uuid)requiredThe customer's id. (Customers are
accountrecords, which is why the parameter has this name.)
Responses
Headers
X-RateLimit-Limit— Requests this key may make per minute.X-RateLimit-Remaining— Requests left in the current minute.
dataobjectrequiredA customer in the register, shared by every module.
idstring(uuid)requirednamestringrequiredcustomer_numberstringnullablerequiredKundnummer, unique in the organization. Assigned on creation unless you send one. Null only on old records that came in through a CRM sync.
customer_typestringrequiredRUT applies only to private persons; ROT to private persons who own the home.
One of
companyprivateorg_numberstringnullablerequiredOrganisationsnummer, e.g.
769612-3456. Empty for a private person.vat_numberstringnullablerequiredVAT registration number (momsregistreringsnummer), e.g.
SE769612345601. Needed on an EU or reverse-charge invoice.domainstringnullablerequiredindustrystringnullablerequiredindustry_codestringnullablerequiredSNI code.
countrystringnullablerequiredISO 3166-1 alpha-2.
invoicingobjectrequiredDefaults for the customer's invoices.
localestringrequiredThe language the customer's people are written to in — invoices, payment reminders, quotes and signing mails:
svoren. Any other value falls back to the organization's language, then Swedish.notesstringnullablerequiredsub_entity_idstring(uuid)nullablerequiredThe office or legal entity the customer belongs to, for organizations that run several. Customers are not hidden by it.
addressesarray of objectsrequiredcontactsarray of objectsOnly on
GET /customers/{account}.tax_profilesarray of objectsOnly on
GET /customers/{account}.created_atstring(date-time)requiredupdated_atstring(date-time)required
- 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.Errors
- 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs:Errors
featurenames the capability (the operation'sx-feature) andrequired_tierthe cheapest tier that grants it. Every operation answers this with"feature": "core.api"when no module the organization holds is on a tier that includes the API. - 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (Errors
module_seat_required— an administrator assigns seats under Settings → Users), or the organization is suspended. - 404No such record in this organization.Errors
- 429The key has made more requests this minute than its limit allows.Errors
Update a customer
/customers/{account}write Permission customers.updateChanges only the fields you send; send null to clear a nullable one.
New invoicing defaults apply to invoices created afterwards. An invoice that already exists keeps the payment terms and currency it was created with, and an issued invoice never changes at all.
curl -X PATCH 'https://api.closepact.com/v1/api/customers/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40' \
-H "Authorization: Bearer $CLOSEPACT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"payment_terms_days": 20,
"late_interest_percent": 10.5,
"reminder_email": "ekonomi@solglantan.se"
}'{
"data": {
"id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"name": "Anna Lindqvist",
"customer_number": "string",
"customer_type": "company",
"org_number": "556677-8899",
"vat_number": "SE556677889901",
"domain": "string",
"industry": "string",
"industry_code": "string",
"country": "SE",
"invoicing": {
"payment_terms_days": 1,
"late_interest_percent": 25,
"vat_mode": "se",
"delivery": "email",
"peppol_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"reference": "string",
"reminder_email": "anna@nordiskfastighet.se",
"currency": "SEK",
"credit_limit_cents": 125000,
"is_blocked": true
},
"locale": "sv",
"notes": "A short description.",
"sub_entity_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"addresses": [
{
"id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"organization_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"account_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"type": "billing",
"label": "string",
"street": "Södra Hamngatan 1",
"street2": "string",
"zip": "411 05",
"city": "Göteborg",
"country": "SE",
"lat": 1,
"lng": 1,
"geofence_radius_m": 1,
"access_notes": "string",
"contact_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"is_default": true,
"metadata": {},
"created_at": "2026-10-18T09:30:00Z",
"updated_at": "2026-10-18T09:30:00Z",
"deleted_at": "2026-10-18T09:30:00Z"
}
],
"contacts": [
{
"id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"organization_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"account_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"email": "anna@nordiskfastighet.se",
"name": "Anna Lindqvist",
"title": "Quarterly window cleaning",
"phone": "+46701234567",
"crm_external_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"crm_provider": "string",
"metadata": {},
"created_at": "2026-10-18T09:30:00Z",
"updated_at": "2026-10-18T09:30:00Z",
"deleted_at": "2026-10-18T09:30:00Z"
}
],
"tax_profiles": [
{
"id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"organization_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"account_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"address_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"label": "string",
"personal_number_last4": "string",
"property_designation": "string",
"apartment_number": "string",
"brf_org_number": "556677-8899",
"co_applicant_name": "string",
"co_applicant_personal_number_last4": "string",
"applicant_share_percent": 25,
"created_at": "2026-10-18T09:30:00Z",
"updated_at": "2026-10-18T09:30:00Z",
"deleted_at": "2026-10-18T09:30:00Z"
}
],
"created_at": "2026-10-18T09:30:00Z",
"updated_at": "2026-10-18T09:30:00Z"
}
}Path parameters
accountstring(uuid)requiredThe customer's id. (Customers are
accountrecords, which is why the parameter has this name.)
Request body
application/json · required
The writable fields of a customer. On update every field is optional.
namestringat most 255 characters
customer_numberstringnullableLeave out on create to have the next number assigned. Must be unique in the organization, deleted customers included — a deleted customer keeps its number. A number already taken is a 422 on
customer_number.at most 32 characters
customer_typestringOne of
companyprivateDefault
"company"org_numberstringnullableat most 32 characters
vat_numberstringnullableat most 32 characters
domainstringnullableat most 255 characters
industrystringnullableat most 64 characters
industry_codestringnullableat most 16 characters
countrystringnullableexactly 2 characters
payment_terms_daysintegerDefault
300–365late_interest_percentnumbernullable0–100
vat_modestringOne of
sereverseeuexportDefault
"se"invoice_deliverystringReturned as
invoicing.delivery.One of
emailpeppolprintDefault
"email"peppol_idstringnullableat most 64 characters
einvoice_referencestringnullableReturned as
invoicing.reference.at most 64 characters
reminder_emailstring(email)nullableat most 320 characters
currencystringDefault
"SEK"exactly 3 characterslocalestringsvoren. Leave out on create to take the organization's language, which is Swedish unless the organization chose English.at most 8 characters
credit_limit_centsintegernullable≥ 0
is_blockedbooleanDefault
falsenotesstringnullablesub_entity_idstring(uuid)nullable
Responses
Headers
X-RateLimit-Limit— Requests this key may make per minute.X-RateLimit-Remaining— Requests left in the current minute.
dataobjectrequiredA customer in the register, shared by every module.
idstring(uuid)requirednamestringrequiredcustomer_numberstringnullablerequiredKundnummer, unique in the organization. Assigned on creation unless you send one. Null only on old records that came in through a CRM sync.
customer_typestringrequiredRUT applies only to private persons; ROT to private persons who own the home.
One of
companyprivateorg_numberstringnullablerequiredOrganisationsnummer, e.g.
769612-3456. Empty for a private person.vat_numberstringnullablerequiredVAT registration number (momsregistreringsnummer), e.g.
SE769612345601. Needed on an EU or reverse-charge invoice.domainstringnullablerequiredindustrystringnullablerequiredindustry_codestringnullablerequiredSNI code.
countrystringnullablerequiredISO 3166-1 alpha-2.
invoicingobjectrequiredDefaults for the customer's invoices.
localestringrequiredThe language the customer's people are written to in — invoices, payment reminders, quotes and signing mails:
svoren. Any other value falls back to the organization's language, then Swedish.notesstringnullablerequiredsub_entity_idstring(uuid)nullablerequiredThe office or legal entity the customer belongs to, for organizations that run several. Customers are not hidden by it.
addressesarray of objectsrequiredcontactsarray of objectsOnly on
GET /customers/{account}.tax_profilesarray of objectsOnly on
GET /customers/{account}.created_atstring(date-time)requiredupdated_atstring(date-time)required
- 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.Errors
- 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs:Errors
featurenames the capability (the operation'sx-feature) andrequired_tierthe cheapest tier that grants it. Every operation answers this with"feature": "core.api"when no module the organization holds is on a tier that includes the API. - 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (Errors
module_seat_required— an administrator assigns seats under Settings → Users), or the organization is suspended. - 404No such record in this organization.Errors
- 422The request body or query failed validation.Errors
- 429The key has made more requests this minute than its limit allows.Errors
Delete a customer
/customers/{account}write Permission customers.deleteRemoves the customer from the register. The record is soft-deleted: it disappears from every list and lookup, but the invoices, quotes and work orders that name it are kept, and so is its customer number — a new customer cannot take it over.
Members with the Account Executive role may create and edit customers but not delete them; deleting is customers.delete.
curl -X DELETE 'https://api.closepact.com/v1/api/customers/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40' \
-H "Authorization: Bearer $CLOSEPACT_API_KEY"{
"deleted": true
}Path parameters
accountstring(uuid)requiredThe customer's id. (Customers are
accountrecords, which is why the parameter has this name.)
Responses
Headers
X-RateLimit-Limit— Requests this key may make per minute.X-RateLimit-Remaining— Requests left in the current minute.
deletedbooleanrequiredOne of
true
- 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.Errors
- 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs:Errors
featurenames the capability (the operation'sx-feature) andrequired_tierthe cheapest tier that grants it. Every operation answers this with"feature": "core.api"when no module the organization holds is on a tier that includes the API. - 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (Errors
module_seat_required— an administrator assigns seats under Settings → Users), or the organization is suspended. - 404No such record in this organization.Errors
- 429The key has made more requests this minute than its limit allows.Errors
Add an address
/customers/{account}/addresseswrite Permission customers.updateAdds a billing, postal or service address to the customer. A customer can have several of each: a housing cooperative billed at its box address with work done at three properties is one customer with one billing and three service addresses.
typedefaults toservice— where the work is done.is_default: truemakes this the default address of its type and takes the flag off the customer's other addresses of the same type.lat,lngandgeofence_radius_m(10–5000 m) let field staff clock in against the address. An address that has coordinates and no radius gets 100 m, and the response says so.
The response contains the fields you sent plus the ids and timestamps; column defaults you did not send (type, country, is_default) are applied but not echoed. Read the customer to see the complete row.
curl -X POST 'https://api.closepact.com/v1/api/customers/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40/addresses' \
-H "Authorization: Bearer $CLOSEPACT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "billing",
"label": "Fakturaadress",
"street": "Box 1123",
"zip": "165 26",
"city": "Hässelby",
"country": "SE",
"is_default": true
}'{
"data": {
"type": "billing",
"label": "Fakturaadress",
"street": "Box 1123",
"zip": "165 26",
"city": "Hässelby",
"country": "SE",
"is_default": true,
"account_id": "01a15a20-3b7e-7f41-9d0c-2a6f4b8e1c55",
"id": "01a15a20-3b9a-7a12-8f3e-5c1d7e9a2b64",
"organization_id": "01a14eb3-c5f0-7c55-8c2e-6a0e1f7b9d21",
"updated_at": "2026-10-18T09:13:02.000000Z",
"created_at": "2026-10-18T09:13:02.000000Z"
}
}Path parameters
accountstring(uuid)requiredThe customer's id.
Request body
application/json · required
The writable fields of an address. On update every field is optional.
typestringOne of
billingpostalserviceDefault
"service"labelstringnullableat most 128 characters
streetstringrequiredat most 255 characters
street2stringnullableat most 255 characters
zipstringnullableat most 16 characters
citystringnullableat most 128 characters
countrystringDefault
"SE"exactly 2 characterslatnumbernullable-90–90
lngnumbernullable-180–180
geofence_radius_mintegernullable10–5,000
access_notesstringnullablecontact_idstring(uuid)nullableis_defaultbooleanDefault
false
Responses
Headers
X-RateLimit-Limit— Requests this key may make per minute.X-RateLimit-Remaining— Requests left in the current minute.
dataobjectrequiredA billing, postal or service address of a customer.
idstring(uuid)requiredorganization_idstring(uuid)requiredaccount_idstring(uuid)requiredThe customer.
typestringserviceis where work is carried out.One of
billingpostalservicelabelstringnullablestreetstringrequiredstreet2stringnullablezipstringnullablePostnummer, e.g.
165 72.citystringnullablecountrystringISO 3166-1 alpha-2;
SEunless stated.latnumbernullablelngnumbernullablegeofence_radius_mintegernullableHow close, in metres, a clock-in has to be to count as on site. Set to 100 when the address is given coordinates without one.
access_notesstringnullableDoor codes, where the key is kept — shown to field staff.
contact_idstring(uuid)nullableThe person to ask for at this address.
is_defaultbooleanmetadataobject | array of valuesFree-form; an empty list when unused.
created_atstring(date-time)requiredupdated_atstring(date-time)requireddeleted_atstring(date-time)nullable
- 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.Errors
- 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs:Errors
featurenames the capability (the operation'sx-feature) andrequired_tierthe cheapest tier that grants it. Every operation answers this with"feature": "core.api"when no module the organization holds is on a tier that includes the API. - 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (Errors
module_seat_required— an administrator assigns seats under Settings → Users), or the organization is suspended. - 404No such record in this organization.Errors
- 422The request body or query failed validation.Errors
- 429The key has made more requests this minute than its limit allows.Errors
Update an address
/customers/{account}/addresses/{address}write Permission customers.updateChanges only the fields you send. Setting is_default: true takes the flag off the customer's other addresses of the same type. If the address ends up with coordinates and no geofence_radius_m, the radius is set to 100 m. Answers with the complete address.
curl -X PATCH 'https://api.closepact.com/v1/api/customers/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40/addresses/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40' \
-H "Authorization: Bearer $CLOSEPACT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"access_notes": "Ny portkod från 1 november: 2280."
}'{
"data": {
"id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"organization_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"account_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"type": "billing",
"label": "string",
"street": "Södra Hamngatan 1",
"street2": "string",
"zip": "411 05",
"city": "Göteborg",
"country": "SE",
"lat": 1,
"lng": 1,
"geofence_radius_m": 1,
"access_notes": "string",
"contact_id": "01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40",
"is_default": true,
"metadata": {},
"created_at": "2026-10-18T09:30:00Z",
"updated_at": "2026-10-18T09:30:00Z",
"deleted_at": "2026-10-18T09:30:00Z"
}
}Path parameters
accountstring(uuid)requiredThe customer's id.
addressstring(uuid)requiredThe address's id. It must belong to this customer, or the answer is 404.
Request body
application/json · required
The writable fields of an address. On update every field is optional.
typestringOne of
billingpostalserviceDefault
"service"labelstringnullableat most 128 characters
streetstringat most 255 characters
street2stringnullableat most 255 characters
zipstringnullableat most 16 characters
citystringnullableat most 128 characters
countrystringDefault
"SE"exactly 2 characterslatnumbernullable-90–90
lngnumbernullable-180–180
geofence_radius_mintegernullable10–5,000
access_notesstringnullablecontact_idstring(uuid)nullableis_defaultbooleanDefault
false
Responses
Headers
X-RateLimit-Limit— Requests this key may make per minute.X-RateLimit-Remaining— Requests left in the current minute.
dataobjectrequiredA billing, postal or service address of a customer.
idstring(uuid)requiredorganization_idstring(uuid)requiredaccount_idstring(uuid)requiredThe customer.
typestringserviceis where work is carried out.One of
billingpostalservicelabelstringnullablestreetstringrequiredstreet2stringnullablezipstringnullablePostnummer, e.g.
165 72.citystringnullablecountrystringISO 3166-1 alpha-2;
SEunless stated.latnumbernullablelngnumbernullablegeofence_radius_mintegernullableHow close, in metres, a clock-in has to be to count as on site. Set to 100 when the address is given coordinates without one.
access_notesstringnullableDoor codes, where the key is kept — shown to field staff.
contact_idstring(uuid)nullableThe person to ask for at this address.
is_defaultbooleanmetadataobject | array of valuesFree-form; an empty list when unused.
created_atstring(date-time)requiredupdated_atstring(date-time)requireddeleted_atstring(date-time)nullable
- 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.Errors
- 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs:Errors
featurenames the capability (the operation'sx-feature) andrequired_tierthe cheapest tier that grants it. Every operation answers this with"feature": "core.api"when no module the organization holds is on a tier that includes the API. - 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (Errors
module_seat_required— an administrator assigns seats under Settings → Users), or the organization is suspended. - 404No such record in this organization.Errors
- 422The request body or query failed validation.Errors
- 429The key has made more requests this minute than its limit allows.Errors
Delete an address
/customers/{account}/addresses/{address}write Permission customers.updateRemoves the address (soft delete). Work orders and invoices that were already addressed keep what was printed on them.
curl -X DELETE 'https://api.closepact.com/v1/api/customers/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40/addresses/01a14f2c-7c1e-7d0b-9a3e-3f5b2c8d1e40' \
-H "Authorization: Bearer $CLOSEPACT_API_KEY"{
"deleted": true
}Path parameters
accountstring(uuid)requiredThe customer's id.
addressstring(uuid)requiredThe address's id. It must belong to this customer, or the answer is 404.
Responses
Headers
X-RateLimit-Limit— Requests this key may make per minute.X-RateLimit-Remaining— Requests left in the current minute.
deletedbooleanrequiredOne of
true
- 401No key, or the key is invalid, revoked or expired, or its creator no longer has access.Errors
- 402The organization has not bought the module this endpoint belongs to, or it has lapsed to read-only, or its tier does not include what the operation needs:Errors
featurenames the capability (the operation'sx-feature) andrequired_tierthe cheapest tier that grants it. Every operation answers this with"feature": "core.api"when no module the organization holds is on a tier that includes the API. - 403The key lacks the scope, or the member it acts as lacks the permission or holds no seat in the module (Errors
module_seat_required— an administrator assigns seats under Settings → Users), or the organization is suspended. - 404No such record in this organization.Errors
- 429The key has made more requests this minute than its limit allows.Errors