openapi: 3.1.0 info: description: 'Fixture''s public v1 CRM API for Accounts, Contacts, Deals, Leads, Activities, Pipelines, Notes, and Tasks. Authenticate with `Authorization: Bearer ...` using either a Fixture API key or a Fixture OAuth access token.' title: Fixture Accounts API version: v1 servers: - url: https://beta-api.fixture.app security: - bearerAuth: [] tags: - description: Create, read, update, and delete company records. name: Accounts paths: /api/v1/accounts: get: deprecated: false description: Return a paginated list of Account summaries for the authenticated organization. Supports filtering by `name`, `industry`, `headquarters_city`, and created/updated timestamps. Sort supports `created_at` or `-created_at`; pagination uses `limit` and `cursor`. Use `fields` to choose which public Account fields appear in each record. operationId: listAccounts parameters: - allowEmptyValue: false allowReserved: false deprecated: false description: Maximum number of records to return. in: query name: limit required: false schema: default: 50 example: 50 type: integer - allowEmptyValue: false allowReserved: false deprecated: false description: Opaque cursor returned by the previous page. Omit for the first page. in: query name: cursor required: false schema: example: eyJ2IjoxLCJzb3J0IjoiLWNyZWF0ZWRfYXQiLCJ2YWx1ZSI6IjIwMjYtMDMtMjJUMTQ6MDA6MDFaIiwiaWQiOiI2NjAxZDYxZC0xMTI5LTQyN2MtODI1NS0wOGI1ZjEyZGRhYjUifQ type: string - allowEmptyValue: false allowReserved: false deprecated: false description: Sort by a supported field. Prefix with `-` for descending order. in: query name: sort required: false schema: default: -created_at example: -created_at type: string - allowEmptyValue: false allowReserved: false deprecated: false description: Filter by a partial, case-insensitive name match. in: query name: name required: false schema: example: Acme type: string - allowEmptyValue: false allowReserved: false deprecated: false description: Filter Accounts by industry. in: query name: industry required: false schema: example: Software type: string - allowEmptyValue: false allowReserved: false deprecated: false in: query name: linkedin_url required: false schema: type: string - allowEmptyValue: false allowReserved: false deprecated: false description: Filter Accounts by headquarters city. in: query name: headquarters_city required: false schema: example: San Francisco type: string - allowEmptyValue: false allowReserved: false deprecated: false description: Return only records created after this ISO 8601 timestamp. in: query name: created_after required: false schema: example: '2026-03-01T00:00:00Z' format: date-time type: string - allowEmptyValue: false allowReserved: false deprecated: false description: Return only records created before this ISO 8601 timestamp. in: query name: created_before required: false schema: example: '2026-03-31T23:59:59Z' format: date-time type: string - allowEmptyValue: false allowReserved: false deprecated: false description: Return only records updated after this ISO 8601 timestamp. in: query name: updated_after required: false schema: example: '2026-03-01T00:00:00Z' format: date-time type: string - allowEmptyValue: false allowReserved: false deprecated: false description: Return only records updated before this ISO 8601 timestamp. in: query name: updated_before required: false schema: example: '2026-03-31T23:59:59Z' format: date-time type: string - allowEmptyValue: false allowReserved: false deprecated: false description: Filter by owner relationship. Use `owner:user_...` for owned records or `owner:none` for unowned records. in: query name: relationship required: false schema: example: owner:user_9T5jXRFuLpTQ3nM4PkGvW2 type: string - allowEmptyValue: false allowReserved: false deprecated: false description: Choose which public fields appear in each list record. Omit or pass a blank value for the default list fields, use `*` alone for every public detail field, or pass comma-separated names. in: query name: fields required: false schema: example: id,name,created_at type: string responses: '200': content: application/json: example: data: - created_at: '2026-03-10T09:00:00Z' employee_count: 240 estimated_revenue: 125000000 headquarters_city: San Francisco headquarters_country: US headquarters_state: CA id: account_7B5jXRFuLpTQ3nM4PkGvW2 industry: Software last_activity_at: '2026-03-24T17:30:00Z' linkedin_url: https://www.linkedin.com/company/acme name: Acme Corp relationships: owner: users: - id: user_9T5jXRFuLpTQ3nM4PkGvW2 updated_at: '2026-03-22T14:00:01Z' website_url: https://acme.example pagination: has_more: false limit: 50 next_cursor: null schema: $ref: '#/components/schemas/V1AccountListPayload' description: Paginated Account list. '400': content: application/json: example: error: code: invalid_parameter message: Invalid cursor schema: $ref: '#/components/schemas/V1ErrorResponse' description: Invalid filter or pagination parameter. '401': content: application/json: example: error: code: unauthorized message: Invalid or missing API key schema: $ref: '#/components/schemas/V1ErrorResponse' description: Missing or invalid API key. '403': content: application/json: example: error: code: forbidden message: 'Missing required scope: accounts:read' schema: $ref: '#/components/schemas/V1ErrorResponse' description: API key is missing the required scope. security: - bearerAuth: [] summary: List Accounts tags: - Accounts post: deprecated: false description: Create a new Account (company) record in the authenticated organization. Returns the full Account detail payload including the generated `acc_` ID. Typically followed by creating Contacts or Deals linked to this Account. operationId: createAccount requestBody: content: application/json: example: employee_count: 240 estimated_revenue: 125000000 industry: Software name: Acme Corp relationships: owner: propagate_to_open_deals: true set: - user_id: user_9T5jXRFuLpTQ3nM4PkGvW2 website_url: https://acme.example schema: $ref: '#/components/schemas/CreateAccountRequest' required: true responses: '201': content: application/json: example: data: created_at: '2026-03-10T09:00:00Z' description: Strategic enterprise customer. employee_count: 240 estimated_revenue: 125000000 headquarters_address: 100 Market Street headquarters_city: San Francisco headquarters_country: US headquarters_postal_code: '94105' headquarters_state: CA id: account_7B5jXRFuLpTQ3nM4PkGvW2 industry: Software last_activity_at: '2026-03-24T17:30:00Z' linkedin_url: https://www.linkedin.com/company/acme name: Acme Corp phone: +1-415-555-0100 relationships: owner: users: - id: user_9T5jXRFuLpTQ3nM4PkGvW2 updated_at: '2026-03-22T14:00:01Z' website_url: https://acme.example schema: $ref: '#/components/schemas/V1AccountDetailResponsePayload' description: Account created. '400': content: application/json: example: error: code: validation_error message: name is required schema: $ref: '#/components/schemas/V1ErrorResponse' description: Request validation failed. '401': content: application/json: example: error: code: unauthorized message: Invalid or missing API key schema: $ref: '#/components/schemas/V1ErrorResponse' description: Missing or invalid API key. '403': content: application/json: example: error: code: forbidden message: 'Missing required scope: accounts:write' schema: $ref: '#/components/schemas/V1ErrorResponse' description: API key is missing the required scope. security: - bearerAuth: [] summary: Create an Account tags: - Accounts /api/v1/accounts/{account_id}: delete: deprecated: false description: Delete an Account by ID. Linked Contacts and Deals are not cascade-deleted — their `account_id` is cleared so the records remain in the organization. operationId: deleteAccount parameters: - deprecated: false description: Opaque Account ID with the `account_` prefix. in: path name: account_id required: true schema: example: account_7B5jXRFuLpTQ3nM4PkGvW2 type: string responses: '200': content: application/json: example: deleted: true id: account_7B5jXRFuLpTQ3nM4PkGvW2 schema: $ref: '#/components/schemas/V1AccountDeletePayload' description: Account deleted. '400': content: application/json: example: error: code: invalid_parameter message: Invalid Account ID schema: $ref: '#/components/schemas/V1ErrorResponse' description: Invalid Account ID. '401': content: application/json: example: error: code: unauthorized message: Invalid or missing API key schema: $ref: '#/components/schemas/V1ErrorResponse' description: Missing or invalid API key. '403': content: application/json: example: error: code: forbidden message: 'Missing required scope: accounts:write' schema: $ref: '#/components/schemas/V1ErrorResponse' description: API key is missing the required scope. '404': content: application/json: example: error: code: not_found message: Account not found schema: $ref: '#/components/schemas/V1ErrorResponse' description: Account not found. security: - bearerAuth: [] summary: Delete an Account tags: - Accounts get: deprecated: false description: Return a single Account by its `acc_` ID with all detail fields. operationId: getAccount parameters: - deprecated: false description: Opaque Account ID with the `account_` prefix. in: path name: account_id required: true schema: example: account_7B5jXRFuLpTQ3nM4PkGvW2 type: string responses: '200': content: application/json: example: data: created_at: '2026-03-10T09:00:00Z' description: Strategic enterprise customer. employee_count: 240 estimated_revenue: 125000000 headquarters_address: 100 Market Street headquarters_city: San Francisco headquarters_country: US headquarters_postal_code: '94105' headquarters_state: CA id: account_7B5jXRFuLpTQ3nM4PkGvW2 industry: Software last_activity_at: '2026-03-24T17:30:00Z' linkedin_url: https://www.linkedin.com/company/acme name: Acme Corp phone: +1-415-555-0100 relationships: owner: users: - id: user_9T5jXRFuLpTQ3nM4PkGvW2 updated_at: '2026-03-22T14:00:01Z' website_url: https://acme.example schema: $ref: '#/components/schemas/V1AccountDetailResponsePayload' description: Account detail. '400': content: application/json: example: error: code: invalid_parameter message: Invalid Account ID schema: $ref: '#/components/schemas/V1ErrorResponse' description: Invalid Account ID. '401': content: application/json: example: error: code: unauthorized message: Invalid or missing API key schema: $ref: '#/components/schemas/V1ErrorResponse' description: Missing or invalid API key. '403': content: application/json: example: error: code: forbidden message: 'Missing required scope: accounts:read' schema: $ref: '#/components/schemas/V1ErrorResponse' description: API key is missing the required scope. '404': content: application/json: example: error: code: not_found message: Account not found schema: $ref: '#/components/schemas/V1ErrorResponse' description: Account not found. security: - bearerAuth: [] summary: Get an Account tags: - Accounts patch: deprecated: false description: Partially update an Account by ID. Only fields present in the request body are modified; omitted fields are left untouched. Pass `null` to clear nullable fields. operationId: updateAccount parameters: - deprecated: false description: Opaque Account ID with the `account_` prefix. in: path name: account_id required: true schema: example: account_7B5jXRFuLpTQ3nM4PkGvW2 type: string requestBody: content: application/json: example: description: Strategic enterprise customer. phone: +1-415-555-0100 relationships: owner: propagate_to_open_deals: true set: - user_id: user_9T5jXRFuLpTQ3nM4PkGvW2 schema: $ref: '#/components/schemas/UpdateAccountRequest' required: true responses: '200': content: application/json: example: data: created_at: '2026-03-10T09:00:00Z' description: Strategic enterprise customer. employee_count: 240 estimated_revenue: 125000000 headquarters_address: 100 Market Street headquarters_city: San Francisco headquarters_country: US headquarters_postal_code: '94105' headquarters_state: CA id: account_7B5jXRFuLpTQ3nM4PkGvW2 industry: Software last_activity_at: '2026-03-24T17:30:00Z' linkedin_url: https://www.linkedin.com/company/acme name: Acme Corp phone: +1-415-555-0100 relationships: owner: users: - id: user_9T5jXRFuLpTQ3nM4PkGvW2 updated_at: '2026-03-22T14:00:01Z' website_url: https://acme.example schema: $ref: '#/components/schemas/V1AccountDetailResponsePayload' description: Updated Account. '400': content: application/json: example: error: code: validation_error message: website_url must be a valid URL schema: $ref: '#/components/schemas/V1ErrorResponse' description: Invalid ID or request body. '401': content: application/json: example: error: code: unauthorized message: Invalid or missing API key schema: $ref: '#/components/schemas/V1ErrorResponse' description: Missing or invalid API key. '403': content: application/json: example: error: code: forbidden message: 'Missing required scope: accounts:write' schema: $ref: '#/components/schemas/V1ErrorResponse' description: API key is missing the required scope. '404': content: application/json: example: error: code: not_found message: Account not found schema: $ref: '#/components/schemas/V1ErrorResponse' description: Account not found. security: - bearerAuth: [] summary: Update an Account tags: - Accounts components: schemas: V1OwnerRelationshipWritePayload: description: Owner relationship update payload. properties: propagate_to_open_deals: default: false description: For Account owner updates, also update open child Deals. type: boolean set: description: Set to one User to assign an owner, or an empty list to clear the owner. items: $ref: '#/components/schemas/V1OwnerRelationshipSetUserPayload' maxItems: 1 type: array required: - set type: object V1AccountSelectedFieldsPayload: properties: created_at: example: '2026-03-22T14:00:01Z' format: date-time type: string description: oneOf: - type: string - type: 'null' employee_count: oneOf: - type: integer - type: 'null' estimated_revenue: oneOf: - type: integer - type: 'null' headquarters_address: oneOf: - type: string - type: 'null' headquarters_city: oneOf: - type: string - type: 'null' headquarters_country: oneOf: - type: string - type: 'null' headquarters_postal_code: oneOf: - type: string - type: 'null' headquarters_state: oneOf: - type: string - type: 'null' id: description: Opaque `account_` identifier. example: account_7B5jXRFuLpTQ3nM4PkGvW2 type: string industry: oneOf: - type: string - type: 'null' last_activity_at: example: '2026-03-24T17:30:00Z' oneOf: - example: '2026-03-24T17:30:00Z' format: date-time type: string - example: '2026-03-24T17:30:00Z' type: 'null' linkedin_url: example: https://www.linkedin.com/company/acme oneOf: - example: https://www.linkedin.com/company/acme type: string - example: https://www.linkedin.com/company/acme type: 'null' name: type: string phone: example: +1-415-555-0100 oneOf: - example: +1-415-555-0100 type: string - example: +1-415-555-0100 type: 'null' relationships: $ref: '#/components/schemas/V1RelationshipsPayload' updated_at: example: '2026-03-22T14:00:01Z' format: date-time type: string website_url: example: https://acme.example oneOf: - example: https://acme.example type: string - example: https://acme.example type: 'null' required: [] title: V1AccountSelectedFieldsPayload type: object V1OwnerRelationshipPayload: description: Owner relationship state for an Account or Deal. properties: users: description: Current owner Users. This list has zero or one item. items: $ref: '#/components/schemas/V1OwnerUserPayload' type: array required: - users type: object V1PaginationPayload: description: Cursor pagination block for public list responses. properties: has_more: description: Whether another page is available. example: false type: boolean limit: description: Requested page size. example: 50 type: integer next_cursor: description: Opaque cursor to pass as `cursor` for the next page, or null when this is the last page. example: null type: - string - 'null' required: - limit - next_cursor - has_more type: object V1AccountDetailResponsePayload: description: Single-Account response envelope. properties: data: $ref: '#/components/schemas/V1AccountDetailPayload' required: - data title: V1AccountDetailResponsePayload type: object V1ErrorResponse: description: Standard error envelope for all public v1 API errors. properties: error: properties: code: description: Stable machine-readable error code. example: not_found type: string message: description: Human-readable error message. example: Account not found type: string required: - code - message type: object required: - error type: object V1AccountListPayload: description: Paginated list response for Accounts. properties: data: items: $ref: '#/components/schemas/V1AccountSelectedFieldsPayload' type: array pagination: $ref: '#/components/schemas/V1PaginationPayload' required: - data - pagination title: V1AccountListPayload type: object V1RelationshipsWritePayload: description: Relationship updates accepted on Account and Deal writes. properties: owner: $ref: '#/components/schemas/V1OwnerRelationshipWritePayload' type: object V1OwnerRelationshipSetUserPayload: description: User assignment entry for an owner relationship update. properties: user_id: description: Opaque `user_` identifier. example: user_9T5jXRFuLpTQ3nM4PkGvW2 type: string required: - user_id type: object V1RelationshipsPayload: description: Relationships attached to an Account or Deal. properties: owner: $ref: '#/components/schemas/V1OwnerRelationshipPayload' required: - owner type: object UpdateAccountRequest: description: Request body for partially updating an Account. properties: description: oneOf: - type: string - type: 'null' employee_count: oneOf: - type: integer - type: 'null' estimated_revenue: oneOf: - type: integer - type: 'null' headquarters_address: oneOf: - type: string - type: 'null' headquarters_city: oneOf: - type: string - type: 'null' headquarters_country: oneOf: - type: string - type: 'null' headquarters_postal_code: oneOf: - type: string - type: 'null' headquarters_state: oneOf: - type: string - type: 'null' industry: oneOf: - type: string - type: 'null' linkedin_url: example: https://www.linkedin.com/company/acme oneOf: - example: https://www.linkedin.com/company/acme type: string - example: https://www.linkedin.com/company/acme type: 'null' name: oneOf: - type: string - type: 'null' phone: example: +1-415-555-0100 oneOf: - example: +1-415-555-0100 type: string - example: +1-415-555-0100 type: 'null' relationships: $ref: '#/components/schemas/V1RelationshipsWritePayload' website_url: example: https://acme.example oneOf: - example: https://acme.example type: string - example: https://acme.example type: 'null' required: [] title: UpdateAccountRequest type: object V1AccountDetailPayload: properties: created_at: example: '2026-03-22T14:00:01Z' format: date-time type: string description: oneOf: - type: string - type: 'null' employee_count: oneOf: - type: integer - type: 'null' estimated_revenue: oneOf: - type: integer - type: 'null' headquarters_address: oneOf: - type: string - type: 'null' headquarters_city: oneOf: - type: string - type: 'null' headquarters_country: oneOf: - type: string - type: 'null' headquarters_postal_code: oneOf: - type: string - type: 'null' headquarters_state: oneOf: - type: string - type: 'null' id: description: Opaque `account_` identifier. example: account_7B5jXRFuLpTQ3nM4PkGvW2 type: string industry: oneOf: - type: string - type: 'null' last_activity_at: example: '2026-03-24T17:30:00Z' oneOf: - example: '2026-03-24T17:30:00Z' format: date-time type: string - example: '2026-03-24T17:30:00Z' type: 'null' linkedin_url: example: https://www.linkedin.com/company/acme oneOf: - example: https://www.linkedin.com/company/acme type: string - example: https://www.linkedin.com/company/acme type: 'null' name: type: string phone: example: +1-415-555-0100 oneOf: - example: +1-415-555-0100 type: string - example: +1-415-555-0100 type: 'null' relationships: $ref: '#/components/schemas/V1RelationshipsPayload' updated_at: example: '2026-03-22T14:00:01Z' format: date-time type: string website_url: example: https://acme.example oneOf: - example: https://acme.example type: string - example: https://acme.example type: 'null' required: - created_at - description - employee_count - estimated_revenue - headquarters_address - headquarters_city - headquarters_country - headquarters_postal_code - headquarters_state - id - industry - last_activity_at - linkedin_url - name - phone - relationships - updated_at - website_url title: V1AccountDetailPayload type: object V1AccountDeletePayload: properties: deleted: const: true type: boolean id: description: Opaque `account_` identifier. example: account_7B5jXRFuLpTQ3nM4PkGvW2 type: string required: - deleted - id title: V1AccountDeletePayload type: object V1OwnerUserPayload: description: User assigned through an owner relationship. Fetch user profile fields from `/api/v1/users` with `users:read`. properties: id: description: Opaque `user_` identifier. example: user_9T5jXRFuLpTQ3nM4PkGvW2 type: string required: - id type: object CreateAccountRequest: description: Request body for creating an Account. properties: description: oneOf: - type: string - type: 'null' employee_count: oneOf: - type: integer - type: 'null' estimated_revenue: oneOf: - type: integer - type: 'null' headquarters_address: oneOf: - type: string - type: 'null' headquarters_city: oneOf: - type: string - type: 'null' headquarters_country: oneOf: - type: string - type: 'null' headquarters_postal_code: oneOf: - type: string - type: 'null' headquarters_state: oneOf: - type: string - type: 'null' industry: oneOf: - type: string - type: 'null' linkedin_url: example: https://www.linkedin.com/company/acme oneOf: - example: https://www.linkedin.com/company/acme type: string - example: https://www.linkedin.com/company/acme type: 'null' name: type: string phone: example: +1-415-555-0100 oneOf: - example: +1-415-555-0100 type: string - example: +1-415-555-0100 type: 'null' relationships: $ref: '#/components/schemas/V1RelationshipsWritePayload' website_url: example: https://acme.example oneOf: - example: https://acme.example type: string - example: https://acme.example type: 'null' required: - name title: CreateAccountRequest type: object securitySchemes: bearerAuth: bearerFormat: API key or OAuth access token description: Send either a Fixture API key or a Fixture OAuth access token in the Authorization header as a bearer token. scheme: bearer type: http