{
	"openapi": "3.0.0",
	"components": {
		"examples": {},
		"headers": {},
		"parameters": {},
		"requestBodies": {},
		"responses": {},
		"schemas": {
			"Record_string.unknown_": {
				"properties": {},
				"additionalProperties": {},
				"type": "object",
				"description": "Construct a type with a set of properties K of type T"
			},
			"ApiErrorItem": {
				"properties": {
					"code": {
						"type": "string"
					},
					"message": {
						"type": "string"
					}
				},
				"required": [
					"code",
					"message"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ApiEnvelope_Record_string.unknown__": {
				"properties": {
					"meta": {
						"properties": {
							"quota": {
								"properties": {
									"usedUnits": {
										"type": "number",
										"format": "double"
									},
									"remainingUnits": {
										"type": "number",
										"format": "double"
									}
								},
								"required": [
									"usedUnits",
									"remainingUnits"
								],
								"type": "object"
							},
							"pagination": {
								"properties": {
									"limit": {
										"type": "number",
										"format": "double"
									},
									"offset": {
										"type": "number",
										"format": "double"
									}
								},
								"required": [
									"limit",
									"offset"
								],
								"type": "object"
							},
							"fieldNaming": {
								"type": "string",
								"enum": [
									"camelCase"
								],
								"nullable": false
							}
						},
						"required": [
							"quota",
							"fieldNaming"
						],
						"type": "object"
					},
					"data": {
						"allOf": [
							{
								"$ref": "#/components/schemas/Record_string.unknown_"
							}
						],
						"nullable": true
					},
					"errors": {
						"items": {
							"$ref": "#/components/schemas/ApiErrorItem"
						},
						"type": "array"
					}
				},
				"required": [
					"meta",
					"data",
					"errors"
				],
				"type": "object",
				"additionalProperties": false
			},
			"Int": {
				"type": "integer",
				"format": "int32"
			}
		},
		"securitySchemes": {
			"BearerAuth": {
				"type": "http",
				"scheme": "bearer"
			}
		}
	},
	"info": {
		"title": "NordicContacts REST API",
		"version": "1.0.0",
		"description": "## Introduction\n\nThe NordicContacts REST API gives you programmatic access to hundreds of thousands of B2B contacts and companies over plain HTTP — no MCP client required. Use any language or tool that can make HTTP requests. The generated OpenAPI specification can also be used to generate strongly typed clients for many languages.\n\n## Authentication\n\nAll endpoints require an `Authorization: Bearer <token>` header. Generate tokens in the **Account → API** section of the app. Your MCP tokens work here too — the same key covers both interfaces.\n\n```\nAuthorization: Bearer gc_mcp_...\n```\n\nMissing or invalid tokens return **401**. Suspended subscriptions or exhausted quota return **403**.\n\n## Quota\n\nRequests that return company/contact data consume quota based on returned rows, with a **minimum charge of 1 unit per request** (even when zero rows are returned). Count endpoints and reference lookups are always free. Your remaining quota is returned in `meta.quota` on every response so you can monitor consumption in real time.\n\n## Request & response format\n\nAll responses use the same JSON envelope:\n\n```json\n{\n  \"meta\": {\n    \"fieldNaming\": \"camelCase\",\n    \"pagination\": { \"offset\": 0, \"limit\": 100 },\n    \"quota\": { \"remainingUnits\": 4820, \"usedUnits\": 180 }\n  },\n  \"data\": { ... },\n  \"errors\": []\n}\n```\n\nError responses follow the same shape with `data: null` and one or more entries in `errors`:\n\n```json\n{\n  \"meta\": {},\n  \"data\": null,\n  \"errors\": [{ \"code\": \"AUTH_FAILED\", \"message\": \"Invalid or expired token.\" }]\n}\n```\n\n## Pagination\n\nList endpoints accept `limit` (max items per page) and `offset` (skip N rows). Call the corresponding `/count` endpoint first to get the total — there is no `meta.total` on list responses.\n\n## Reference data\n\nThe **Reference** group contains lookup endpoints (`/countries`, `/industries`, `/industry-groups`, `/job-functions`, `/responsibility-areas`) that return the IDs and codes used as filter parameters in contact and company search. Reference lookups carry no quota cost.",
		"contact": {}
	},
	"paths": {
		"/responsibility-areas": {
			"get": {
				"operationId": "ListResponsibilityAreas",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "List main responsibility areas\n\nReturns main responsibility area classifications with their numeric IDs.\nPass `mainResponsibilityAreaIds` to filter contacts by their areas of\norganisational responsibility. No quota cost.",
				"summary": "List main responsibility areas",
				"tags": [
					"Reference"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": [
					{
						"description": "Optional substring filter (≥ 2 characters).",
						"in": "query",
						"name": "search",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Maximum number of results to return (max 500, default 200).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					}
				]
			}
		},
		"/job-functions": {
			"get": {
				"operationId": "ListJobFunctions",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "List job functions\n\nReturns job function classifications with their numeric IDs. Pass\n`jobFunctionIds` (comma-separated) to filter contacts by their role\ncategory. No quota cost.",
				"summary": "List job functions",
				"tags": [
					"Reference"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": [
					{
						"description": "Optional substring filter (≥ 2 characters).",
						"in": "query",
						"name": "search",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Maximum number of results to return (max 500, default 200).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					}
				]
			}
		},
		"/industry-groups": {
			"get": {
				"operationId": "ListIndustryGroups",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "List industry groups\n\nReturns broad sector classifications (industry groups) with their numeric\nIDs. Pass `industryGroupIds` (comma-separated) to filter contacts or\ncompanies by sector. More granular filtering is possible with\n`GET /industries` (TOL codes). No quota cost.",
				"summary": "List industry groups",
				"tags": [
					"Reference"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": [
					{
						"description": "Optional substring filter (≥ 2 characters).",
						"in": "query",
						"name": "search",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Maximum number of results to return (max 500, default 200).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					}
				]
			}
		},
		"/industries": {
			"get": {
				"operationId": "ListIndustries",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "List industries\n\nReturns industry codes for the given country with their IDs and names.\nEach country uses a different classification system:\n- **Finland** (`countryId` = -2460) — TOL 2025\n- **Sweden** (`countryId` = -7520) — SNI 2025\n- **Estonia** (`countryId` = -2330) — EMTAK 2025\n\nPass `industryCodes` (5-digit codes, comma-separated) to filter contacts\nor companies by industry. No quota cost.",
				"summary": "List industries",
				"tags": [
					"Reference"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": [
					{
						"description": "Country to return industries for. Use IDs from `GET /countries` (-2460 = Finland, -7520 = Sweden, -2330 = Estonia).",
						"in": "query",
						"name": "countryId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Optional substring filter (≥ 2 characters).",
						"in": "query",
						"name": "search",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Maximum results per page (max 500, default 200).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Pagination offset (default 0).",
						"in": "query",
						"name": "offset",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					}
				]
			}
		},
		"/countries": {
			"get": {
				"operationId": "ListCountries",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "List countries\n\nReturns all available countries with their numeric IDs. Pass a `countryId`\nfrom this list to filter contacts or companies by country.\nNo quota cost.",
				"summary": "List countries",
				"tags": [
					"Reference"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": [
					{
						"description": "Optional substring filter (≥ 2 characters).",
						"in": "query",
						"name": "search",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Maximum number of results to return (max 500, default 200).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					}
				]
			}
		},
		"/contacts": {
			"get": {
				"operationId": "ListContacts",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "List contacts\n\nReturns a paginated list of contacts matching the provided filters. Country filter is mandatory.\nAll other filter parameters are optional and combinable. The response is capped at\nyour remaining quota if the requested `limit` exceeds it.\n\n**Quota cost:** 1 unit per returned contact row, minimum 1 per request.",
				"summary": "List contacts",
				"tags": [
					"Contacts"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": [
					{
						"description": "Filter by country. This is mandatory. Get IDs from `GET /countries`.",
						"in": "query",
						"name": "countryId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Filter by a specific company (integer company ID from search results).",
						"in": "query",
						"name": "companyId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Filter by company business registration number (e.g. Finnish Y-tunnus).",
						"in": "query",
						"name": "businessId",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Filter by region name (e.g. `Uusimaa`).",
						"in": "query",
						"name": "regionName",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Comma-separated industry group IDs. Get IDs from `GET /industry-groups`.",
						"in": "query",
						"name": "industryGroupIds",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"$ref": "#/components/schemas/Int"
							}
						}
					},
					{
						"description": "Comma-separated 5-digit TOL/NACE codes. Get codes from `GET /industries`.",
						"in": "query",
						"name": "industryCodes",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					{
						"description": "Filter by responsibility area IDs. Get IDs from `GET /responsibility-areas`.",
						"in": "query",
						"name": "mainResponsibilityAreaIds",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"$ref": "#/components/schemas/Int"
							}
						}
					},
					{
						"description": "Comma-separated job function IDs. Get IDs from `GET /job-functions`.",
						"in": "query",
						"name": "jobFunctionIds",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"$ref": "#/components/schemas/Int"
							}
						}
					},
					{
						"description": "Minimum company annual turnover in EUR thousands.",
						"in": "query",
						"name": "turnoverMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Maximum company annual turnover in EUR thousands.",
						"in": "query",
						"name": "turnoverMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Minimum company annual profit in EUR thousands.",
						"in": "query",
						"name": "profitMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Maximum company annual profit in EUR thousands.",
						"in": "query",
						"name": "profitMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Minimum company headcount.",
						"in": "query",
						"name": "personnelMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Maximum company headcount.",
						"in": "query",
						"name": "personnelMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Filter companies founded on or after this year.",
						"in": "query",
						"name": "foundedYearMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Filter companies founded on or before this year.",
						"in": "query",
						"name": "foundedYearMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Only include contacts added within this many days (1–3650).",
						"in": "query",
						"name": "newContactsWithinDays",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Only include contacts with a new responsibility assignment within this many days.",
						"in": "query",
						"name": "newResponsibilityAssignmentsWithinDays",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Comma-separated organisation levels: `Top Management`, `Middle Management`, `Experts`, `Secretary/Assistant`.",
						"in": "query",
						"name": "organizationLevels",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					{
						"description": "Webshop status: `identified`, `not_identified`, or `not_crawled`. Omitted imposes no restriction and includes 0 and NULL rows.",
						"in": "query",
						"name": "webshopStatus",
						"required": false,
						"schema": {
							"type": "string",
							"enum": [
								"identified",
								"not_identified",
								"not_crawled"
							]
						}
					},
					{
						"description": "Comma-separated webshop platform names (e.g. `shopify`). Implies `identified`. Omitted includes all platforms and uncrawled rows.",
						"in": "query",
						"name": "webshopPlatforms",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					{
						"description": "Target market: `b2b`, `b2c`, `both`, `unknown`, or `not_crawled`. Omitted imposes no restriction and includes 0 and NULL rows.",
						"in": "query",
						"name": "targetMarket",
						"required": false,
						"schema": {
							"type": "string",
							"enum": [
								"b2b",
								"b2c",
								"both",
								"unknown",
								"not_crawled"
							]
						}
					},
					{
						"description": "Only include contacts that have an email (`email`), phone (`phone`), both (`both`), or either (`either`). Default: `email`.",
						"in": "query",
						"name": "contactInfoFilter",
						"required": false,
						"schema": {
							"default": "email",
							"type": "string",
							"enum": [
								"email",
								"phone",
								"both",
								"either"
							]
						}
					},
					{
						"description": "Optional customer-list mode: `exclude` removes companies on your customer list (net-new prospecting), `limit` returns only customer-list companies, `ignore` (or omitted) ignores the customer list. `exclude`/`limit` require an active customer list; fails with `CUSTOMER_LIST_REQUIRED` otherwise. Your account exclusion list always applies automatically.",
						"in": "query",
						"name": "customerListMode",
						"required": false,
						"schema": {
							"type": "string",
							"enum": [
								"ignore",
								"exclude",
								"limit"
							]
						}
					},
					{
						"description": "Number of contacts to return (1–2000, default 100).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Pagination offset (default 0).",
						"in": "query",
						"name": "offset",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					}
				]
			}
		},
		"/contacts/count": {
			"get": {
				"operationId": "CountContacts",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "Count contacts\n\nReturns the total number of contacts (and distinct employer companies)\nmatching the provided filters, without returning any contact data. Use\nthis to gauge result set size before fetching with `GET /contacts`.\n\n**Quota cost:** None — counts are always free.",
				"summary": "Count contacts",
				"tags": [
					"Contacts"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": [
					{
						"description": "Filter by country. This is mandatory. Get IDs from `GET /countries`.",
						"in": "query",
						"name": "countryId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Filter by a specific company (integer company ID from search results).",
						"in": "query",
						"name": "companyId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Filter by company business registration number.",
						"in": "query",
						"name": "businessId",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Filter by region name (e.g. `Uusimaa`).",
						"in": "query",
						"name": "regionName",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Comma-separated industry group IDs.",
						"in": "query",
						"name": "industryGroupIds",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"$ref": "#/components/schemas/Int"
							}
						}
					},
					{
						"description": "Comma-separated 5-digit TOL/NACE codes.",
						"in": "query",
						"name": "industryCodes",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					{
						"description": "Filter by responsibility area IDs.",
						"in": "query",
						"name": "mainResponsibilityAreaIds",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"$ref": "#/components/schemas/Int"
							}
						}
					},
					{
						"description": "Comma-separated job function IDs.",
						"in": "query",
						"name": "jobFunctionIds",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"$ref": "#/components/schemas/Int"
							}
						}
					},
					{
						"description": "Minimum company annual turnover in EUR thousands.",
						"in": "query",
						"name": "turnoverMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Maximum company annual turnover in EUR thousands.",
						"in": "query",
						"name": "turnoverMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Minimum company annual profit in EUR thousands.",
						"in": "query",
						"name": "profitMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Maximum company annual profit in EUR thousands.",
						"in": "query",
						"name": "profitMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Minimum company headcount.",
						"in": "query",
						"name": "personnelMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Maximum company headcount.",
						"in": "query",
						"name": "personnelMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Filter companies founded on or after this year.",
						"in": "query",
						"name": "foundedYearMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Filter companies founded on or before this year.",
						"in": "query",
						"name": "foundedYearMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Only include contacts added within this many days (1–3650).",
						"in": "query",
						"name": "newContactsWithinDays",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Only include contacts with a new responsibility assignment within this many days.",
						"in": "query",
						"name": "newResponsibilityAssignmentsWithinDays",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Comma-separated organisation levels.",
						"in": "query",
						"name": "organizationLevels",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					{
						"description": "Webshop status: `identified`, `not_identified`, or `not_crawled`. Omitted imposes no restriction and includes 0 and NULL rows.",
						"in": "query",
						"name": "webshopStatus",
						"required": false,
						"schema": {
							"type": "string",
							"enum": [
								"identified",
								"not_identified",
								"not_crawled"
							]
						}
					},
					{
						"description": "Comma-separated webshop platform names. Implies `identified`. Omitted includes all platforms and uncrawled rows.",
						"in": "query",
						"name": "webshopPlatforms",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					{
						"description": "Target market: `b2b`, `b2c`, `both`, `unknown`, or `not_crawled`. Omitted imposes no restriction and includes 0 and NULL rows.",
						"in": "query",
						"name": "targetMarket",
						"required": false,
						"schema": {
							"type": "string",
							"enum": [
								"b2b",
								"b2c",
								"both",
								"unknown",
								"not_crawled"
							]
						}
					},
					{
						"description": "Count only contacts with email / phone / both / either. Default: `email`.",
						"in": "query",
						"name": "contactInfoFilter",
						"required": false,
						"schema": {
							"default": "email",
							"type": "string",
							"enum": [
								"email",
								"phone",
								"both",
								"either"
							]
						}
					},
					{
						"description": "Optional customer-list mode: `exclude` removes companies on your customer list, `limit` returns only customer-list companies, `ignore` (or omitted) ignores the customer list. `exclude`/`limit` require an active customer list; fails with `CUSTOMER_LIST_REQUIRED` otherwise. Your account exclusion list always applies automatically.",
						"in": "query",
						"name": "customerListMode",
						"required": false,
						"schema": {
							"type": "string",
							"enum": [
								"ignore",
								"exclude",
								"limit"
							]
						}
					}
				]
			}
		},
		"/contacts/lookup": {
			"get": {
				"operationId": "LookupContactByEmail",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "Look up contact by email\n\nFinds a single contact by their exact email address. Returns a 404 if no\ncontact is found with that email.\n\n**Quota cost:** 1 unit per request.",
				"summary": "Look up contact by email",
				"tags": [
					"Contacts"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": [
					{
						"description": "The exact email address to look up.",
						"in": "query",
						"name": "email",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				]
			}
		},
		"/companies": {
			"get": {
				"operationId": "ListCompanies",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "List companies\n\nReturns a paginated list of companies matching the provided filters. The\nresponse contains company-level fields only — no contacts are embedded.\nTo retrieve contacts for a company, use\n`GET /companies/{companyId}/contacts`.\n\nThe `companyContactFilter` parameter controls which companies are included\nbased on whether they have contacts with email / phone / both / all — it\nis a filter criterion, not a field selector.\n\nThe response is capped at your remaining quota if `limit` exceeds it.\n\n**Quota cost:** 1 unit per returned company row, minimum 1 per request.",
				"summary": "List companies",
				"tags": [
					"Companies"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": [
					{
						"description": "Filter by country. This is mandatory. Get IDs from `GET /countries`.",
						"in": "query",
						"name": "countryId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Filter to a specific company by its integer ID.",
						"in": "query",
						"name": "companyId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Filter by business registration number (e.g. Finnish Y-tunnus).",
						"in": "query",
						"name": "businessId",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Filter by region name (e.g. `Uusimaa`).",
						"in": "query",
						"name": "regionName",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Comma-separated industry group IDs. Get IDs from `GET /industry-groups`.",
						"in": "query",
						"name": "industryGroupIds",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"$ref": "#/components/schemas/Int"
							}
						}
					},
					{
						"description": "Comma-separated 5-digit TOL/NACE codes. Get codes from `GET /industries`.",
						"in": "query",
						"name": "industryCodes",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					{
						"description": "Filter by responsibility area IDs.",
						"in": "query",
						"name": "mainResponsibilityAreaIds",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"$ref": "#/components/schemas/Int"
							}
						}
					},
					{
						"description": "Comma-separated job function IDs.",
						"in": "query",
						"name": "jobFunctionIds",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"$ref": "#/components/schemas/Int"
							}
						}
					},
					{
						"description": "Minimum annual turnover in EUR thousands.",
						"in": "query",
						"name": "turnoverMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Maximum annual turnover in EUR thousands.",
						"in": "query",
						"name": "turnoverMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Minimum annual profit in EUR thousands.",
						"in": "query",
						"name": "profitMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Maximum annual profit in EUR thousands.",
						"in": "query",
						"name": "profitMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Minimum headcount.",
						"in": "query",
						"name": "personnelMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Maximum headcount.",
						"in": "query",
						"name": "personnelMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Founded on or after this year.",
						"in": "query",
						"name": "foundedYearMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Founded on or before this year.",
						"in": "query",
						"name": "foundedYearMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Only include companies that have gained new contacts within this many days (1–3650).",
						"in": "query",
						"name": "newContactsWithinDays",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Only include companies with new responsibility assignments within this many days.",
						"in": "query",
						"name": "newResponsibilityAssignmentsWithinDays",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Comma-separated levels: `Top Management`, `Middle Management`, `Experts`, `Secretary/Assistant`.",
						"in": "query",
						"name": "organizationLevels",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					{
						"description": "Webshop status: `identified`, `not_identified`, or `not_crawled`. Omitted imposes no restriction and includes 0 and NULL rows.",
						"in": "query",
						"name": "webshopStatus",
						"required": false,
						"schema": {
							"type": "string",
							"enum": [
								"identified",
								"not_identified",
								"not_crawled"
							]
						}
					},
					{
						"description": "Comma-separated webshop platform names. Implies `identified`. Omitted includes all platforms and uncrawled rows.",
						"in": "query",
						"name": "webshopPlatforms",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					{
						"description": "Target market: `b2b`, `b2c`, `both`, `unknown`, or `not_crawled`. Omitted imposes no restriction and includes 0 and NULL rows.",
						"in": "query",
						"name": "targetMarket",
						"required": false,
						"schema": {
							"type": "string",
							"enum": [
								"b2b",
								"b2c",
								"both",
								"unknown",
								"not_crawled"
							]
						}
					},
					{
						"description": "Include only companies whose contacts have: `email`, `phone`, `both`, or `all` (no filter). Default: `email`.",
						"in": "query",
						"name": "companyContactFilter",
						"required": false,
						"schema": {
							"default": "email",
							"type": "string",
							"enum": [
								"all",
								"email",
								"phone",
								"both"
							]
						}
					},
					{
						"description": "Optional customer-list mode: `exclude` removes companies on your customer list (net-new prospecting), `limit` returns only customer-list companies, `ignore` (or omitted) ignores the customer list. `exclude`/`limit` require an active customer list; fails with `CUSTOMER_LIST_REQUIRED` otherwise. Your account exclusion list always applies automatically.",
						"in": "query",
						"name": "customerListMode",
						"required": false,
						"schema": {
							"type": "string",
							"enum": [
								"ignore",
								"exclude",
								"limit"
							]
						}
					},
					{
						"description": "Number of companies to return (1–2000, default 100).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Pagination offset (default 0).",
						"in": "query",
						"name": "offset",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					}
				]
			}
		},
		"/companies/count": {
			"get": {
				"operationId": "CountCompanies",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "Count companies\n\nReturns the total number of companies matching the provided filters,\nwithout returning any company data. Accepts the same filter parameters as\n`GET /companies`. Use this to gauge result set size before fetching.\n\n**Quota cost:** None — counts are always free.",
				"summary": "Count companies",
				"tags": [
					"Companies"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": [
					{
						"description": "Filter by country. This is mandatory. Get IDs from `GET /countries`.",
						"in": "query",
						"name": "countryId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Filter to a specific company.",
						"in": "query",
						"name": "companyId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Filter by business registration number.",
						"in": "query",
						"name": "businessId",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Filter by region name.",
						"in": "query",
						"name": "regionName",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Comma-separated industry group IDs.",
						"in": "query",
						"name": "industryGroupIds",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"$ref": "#/components/schemas/Int"
							}
						}
					},
					{
						"description": "Comma-separated 5-digit TOL/NACE codes.",
						"in": "query",
						"name": "industryCodes",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					{
						"description": "Filter by responsibility area IDs.",
						"in": "query",
						"name": "mainResponsibilityAreaIds",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"$ref": "#/components/schemas/Int"
							}
						}
					},
					{
						"description": "Comma-separated job function IDs.",
						"in": "query",
						"name": "jobFunctionIds",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"$ref": "#/components/schemas/Int"
							}
						}
					},
					{
						"description": "Minimum annual turnover in EUR thousands.",
						"in": "query",
						"name": "turnoverMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Maximum annual turnover in EUR thousands.",
						"in": "query",
						"name": "turnoverMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Minimum annual profit in EUR thousands.",
						"in": "query",
						"name": "profitMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Maximum annual profit in EUR thousands.",
						"in": "query",
						"name": "profitMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Minimum headcount.",
						"in": "query",
						"name": "personnelMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Maximum headcount.",
						"in": "query",
						"name": "personnelMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Founded on or after this year.",
						"in": "query",
						"name": "foundedYearMin",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Founded on or before this year.",
						"in": "query",
						"name": "foundedYearMax",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "New contacts added within this many days.",
						"in": "query",
						"name": "newContactsWithinDays",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "New responsibility assignments within this many days.",
						"in": "query",
						"name": "newResponsibilityAssignmentsWithinDays",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Comma-separated organisation levels.",
						"in": "query",
						"name": "organizationLevels",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					{
						"description": "Webshop status: `identified`, `not_identified`, or `not_crawled`. Omitted imposes no restriction and includes 0 and NULL rows.",
						"in": "query",
						"name": "webshopStatus",
						"required": false,
						"schema": {
							"type": "string",
							"enum": [
								"identified",
								"not_identified",
								"not_crawled"
							]
						}
					},
					{
						"description": "Comma-separated webshop platform names. Implies `identified`. Omitted includes all platforms and uncrawled rows.",
						"in": "query",
						"name": "webshopPlatforms",
						"required": false,
						"schema": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					{
						"description": "Target market: `b2b`, `b2c`, `both`, `unknown`, or `not_crawled`. Omitted imposes no restriction and includes 0 and NULL rows.",
						"in": "query",
						"name": "targetMarket",
						"required": false,
						"schema": {
							"type": "string",
							"enum": [
								"b2b",
								"b2c",
								"both",
								"unknown",
								"not_crawled"
							]
						}
					},
					{
						"description": "Count only companies whose contacts have email / phone / both / all. Default: `email`.",
						"in": "query",
						"name": "companyContactFilter",
						"required": false,
						"schema": {
							"default": "email",
							"type": "string",
							"enum": [
								"all",
								"email",
								"phone",
								"both"
							]
						}
					},
					{
						"description": "Optional customer-list mode: `exclude` removes companies on your customer list, `limit` returns only customer-list companies, `ignore` (or omitted) ignores the customer list. `exclude`/`limit` require an active customer list; fails with `CUSTOMER_LIST_REQUIRED` otherwise. Your account exclusion list always applies automatically.",
						"in": "query",
						"name": "customerListMode",
						"required": false,
						"schema": {
							"type": "string",
							"enum": [
								"ignore",
								"exclude",
								"limit"
							]
						}
					}
				]
			}
		},
		"/companies/resolve": {
			"get": {
				"operationId": "ResolveCompany",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "Resolve company by domain\n\nFinds the best-matching company for a given email domain or website domain\n(e.g. `acme.fi`). Returns a 404 if no company is associated with the\nprovided domain.\n\n**Quota cost:** 1 unit per request.",
				"summary": "Resolve company by domain",
				"tags": [
					"Companies"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": [
					{
						"description": "The domain to resolve (e.g. `acme.fi`). Do not include `http://` or `www.`.",
						"in": "query",
						"name": "domain",
						"required": true,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Optional country ID limiting the lookup to one country (e.g. when the same domain exists on companies in several countries). Get IDs from `GET /countries`.",
						"in": "query",
						"name": "countryId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					}
				]
			}
		},
		"/companies/find": {
			"get": {
				"operationId": "FindCompanies",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "Find companies by identity\n\nIdentity-resolves a company by name, business registration number, or\ndomain. At least one of the three parameters must be provided. Returns\nranked candidates with a `matchType` and relevance `score`.\n\nUseful for enrichment workflows where you have partial company information\nand want to identify the matching record.\n\n**Quota cost:** 1 unit per returned candidate, minimum 1 per request.",
				"summary": "Find companies by identity",
				"tags": [
					"Companies"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": [
					{
						"description": "Company name to search for (≥ 2 characters).",
						"in": "query",
						"name": "companyName",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Business registration number (e.g. Finnish Y-tunnus).",
						"in": "query",
						"name": "businessId",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Website or email domain (e.g. `acme.fi`).",
						"in": "query",
						"name": "domain",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Optional country ID limiting the search to one country. Get IDs from `GET /countries`.",
						"in": "query",
						"name": "countryId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Maximum number of candidates to return (1–20, default 10).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					}
				]
			}
		},
		"/companies/{companyId}/contacts": {
			"get": {
				"operationId": "ListCompanyContacts",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "List contacts for a company\n\nReturns a paginated list of contacts associated with the specified company.\nThe `companyId` is the integer `id` field returned in company search\nresults (`GET /companies` or `GET /companies/find`).\n\n**Quota cost:** 1 unit per returned contact row, minimum 1 per request.",
				"summary": "List contacts for a company",
				"tags": [
					"Companies"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": [
					{
						"description": "Integer company ID (from `GET /companies` results).",
						"in": "path",
						"name": "companyId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Only include contacts with email (`email`), phone (`phone`), or both (`both`). Default: `email`.",
						"in": "query",
						"name": "contactInfoFilter",
						"required": false,
						"schema": {
							"default": "email",
							"type": "string",
							"enum": [
								"email",
								"phone",
								"both"
							]
						}
					},
					{
						"description": "Number of contacts to return (1–100, default 25).",
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					},
					{
						"description": "Pagination offset (default 0).",
						"in": "query",
						"name": "offset",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Int"
						}
					}
				]
			}
		},
		"/account": {
			"get": {
				"operationId": "GetAccount",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiEnvelope_Record_string.unknown__"
								}
							}
						}
					}
				},
				"description": "Get account info\n\nReturns the subscription status, current billing period, included and\nprepaid quota units, and how many units have been consumed this period.\nAlso lists Starter/Pro plan pricing, one-time Excel pricing\n(EUR 0.20/contact, EUR 20 minimum), available top-up bundles, and the\nshared-balance policy across subscribed Excel exports, MCP, and REST API.\n\n**Quota cost:** None.",
				"summary": "Get account info",
				"tags": [
					"Account"
				],
				"security": [
					{
						"BearerAuth": []
					}
				],
				"parameters": []
			}
		}
	},
	"servers": [
		{
			"url": "/api/v1"
		}
	]
}