Charthop billing API
The billing API from Charthop — 3 operation(s) for billing.
The billing API from Charthop — 3 operation(s) for billing.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/charthop-billing-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
description: REST API for ChartHop
version: V1.0.0
title: ChartHop access Billing API
contact:
name: ChartHop
url: https://www.charthop.com
email: support@charthop.com
servers:
- url: https://localhost
- url: http://localhost
tags:
- name: billing
paths:
/v1/customer/{customerId}/billing:
get:
tags:
- billing
summary: Return billing information for a customer
operationId: getBilling
parameters:
- name: customerId
in: path
description: Customer id
required: true
schema:
type: string
responses:
'200':
description: successful operation
content:
application/json:
schema:
$ref: '#/components/schemas/Billing'
'400':
description: invalid data
'401':
description: not authorized
'403':
description: permission denied
'404':
description: not found
/v1/customer/{customerId}/billing/cancel:
post:
tags:
- billing
summary: Cancel a subscription for a customer
operationId: cancelSubscription
parameters:
- name: customerId
in: path
description: Customer id
required: true
schema:
type: string
responses:
'400':
description: invalid data
'401':
description: not authorized
'403':
description: permission denied
'404':
description: not found
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CancelSubscriptionSurveyAnswers'
description: Survey response
required: true
/v1/customer/{customerId}/billing/checkout:
post:
tags:
- billing
summary: Checks out customer to upgrade to pay for their subscription
operationId: checkout
parameters:
- name: customerId
in: path
description: Customer id
required: true
schema:
type: string
responses:
'400':
description: invalid data
'401':
description: not authorized
'403':
description: permission denied
'404':
description: not found
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateSubscription'
description: Subscription data to create
required: true
components:
schemas:
Plan:
type: object
required:
- id
- name
- interval
- intervalCount
- tiers
- stripeProductId
properties:
id:
type: string
description: unique Stripe identifier for this plan
name:
type: string
description: human-readable nickname for this plan
interval:
type: string
description: interval for billing on this plan
enum:
- DAY
- WEEK
- MONTH
- YEAR
intervalCount:
type: integer
format: int32
description: number of intervals, for example 3 for quarterly billing
tiers:
type: array
description: pricing tiers, per employee per interval
items:
$ref: '#/components/schemas/PlanTier'
stripeProductId:
type: string
description: stripe product id that this plan belongs to
CancelSubscriptionSurveyAnswers:
type: object
required:
- otherComments
- reason
properties:
otherComments:
type: string
description: Any additional comments about ChartHop when cancelling their subscription
reason:
type: string
description: Concatenated string of reasons why the customer unsubscribed from ChartHop
Address:
type: object
required:
- country
properties:
street1:
type: string
description: street address, line 1
example: 123 Anywhere Street
minItems: 0
maxItems: 200
street2:
type: string
description: street address, line 2
example: Apt 6L
minItems: 0
maxItems: 200
street3:
type: string
description: street address, line 3
example: Sixth Floor
minItems: 0
maxItems: 200
city:
type: string
description: city
example: New York
minItems: 0
maxItems: 80
state:
type: string
description: state
example: NY
minItems: 0
maxItems: 80
country:
type: string
description: country (two-digit ISO code)
example: NY
pattern: ^[A-Z]{2}$
postal:
type: string
description: postal code
example: '10001'
minItems: 0
maxItems: 10
geo:
description: geopoint location
$ref: '#/components/schemas/Geopoint'
approxGeo:
description: approximate geopoint location (suitable for a map placement, but not exact location)
$ref: '#/components/schemas/Geopoint'
InternalOrgOptions:
type: object
properties:
adpOrganizationOID:
type: string
assessmentCount:
type: integer
format: int32
dashboardGettingStartedHidden:
type: boolean
dashboardNeedHelpHidden:
type: boolean
enableUniversalSso:
type: boolean
sequoiaOrgId:
type: string
tosAgreement:
type: boolean
fileUploadLimit:
type: integer
format: int64
maxFileUploadSize:
type: integer
format: int64
lowPriorityReports:
type: boolean
isInitialDataSynced:
type: boolean
maxReportDatapoints:
type: integer
format: int64
disableImportEvents:
type: boolean
description: Whether to disable event notifications on imports -- should only be used temporarily in performance-critical initial imports
useAlphaSlackApp:
type: boolean
description: Use the alpha Slack app (a second real Slack app sharing the global 'slack' install) instead of the default for inbound hooks and outbound messages — ChartHop-staff only, for Slack-team app-review testing
extraFields:
type: object
additionalProperties:
type: object
Billing:
type: object
required:
- customer
- invoices
- org
properties:
checkout:
$ref: '#/components/schemas/Checkout'
customer:
$ref: '#/components/schemas/Customer'
invoices:
type: array
items:
$ref: '#/components/schemas/Invoice'
paymentInfo:
$ref: '#/components/schemas/PaymentInfo'
plan:
$ref: '#/components/schemas/Plan'
org:
$ref: '#/components/schemas/Org'
PlanTier:
type: object
required:
- unitAmount
properties:
upTo:
type: integer
format: int64
description: headcount up to this level is charged at the below rate
unitAmount:
type: number
description: PEPM rate
Org:
type: object
required:
- id
- name
- slug
- options
properties:
id:
type: string
description: globally unique id
example: 588f7ee98f138b19220041a7
customerId:
type: string
description: customer for billing processing
example: 588f7ee98f138b19220041a7
name:
type: string
description: name of organization
example: Acme Corp
slug:
type: string
description: unique slug of organization
example: acme-corp
type:
type: string
description: type of organization
example: PRIVATE
enum:
- PRIVATE
- PUBLIC
- EDU
- GOV
- NONPROFIT
- DEMO
- TEST
- PORTFOLIO
industry:
type: string
description: industry
example: Software and Internet
estEmployees:
type: integer
format: int32
description: approximate number of employees
estRevenue:
type: integer
format: int32
description: approximate amount of revenue
foundedYear:
type: string
description: year of founding
example: '1998'
address:
description: street address
$ref: '#/components/schemas/Address'
phone:
type: string
description: company phone number in E.164 format
pattern: ^\+?[1-9]\d{1,14}$
email:
type: string
description: primary contact email
example: bob@example.com
url:
type: string
format: uri
description: website URL
domains:
type: array
description: domains used by this org
items:
$ref: '#/components/schemas/OrgDomain'
status:
type: string
description: current status of organization
enum:
- ACTIVE
- INACTIVE
- DISABLED
imagePath:
type: string
description: path to full-sized profile image in storage
pattern: ^[a-zA-Z0-9._/-]+$
currencies:
type: array
description: types of currencies in use, with the first currency the primary currency
items:
type: string
minItems: 1
maxItems: 100
locales:
type: array
description: locales supported within the org based on user selection, with the first locale the primary locale (e.g., en_US, en_GB, fr_FR, fr_CA)
items:
type: string
dataResidency:
type: string
description: data residency of the org - the db cluster where this org's data resides
enum:
- GLOBAL
- US
- EU
stock:
type: string
description: stock symbol
example: GOOG
timezone:
type: string
description: timezone in use
example: America/New_York
appTimes:
type: array
description: approximate times of day in the org timezone for daily app syncs to run (if unset, syncs will run 2am-8am US Eastern Time)
example: 09:00
items:
type: string
fiscalStart:
type: integer
format: int32
description: number of months into the calendar year that the fiscal year starts (1 = February, 2 = March)
headJobId:
type: string
description: head of the organization
example: 588f7ee98f138b19220041a7
unassignedManagerJobId:
type: string
description: Job ID that all jobs with missing manager report to in the organization
example: 588f7ee98f138b19220041a7
portfolioParentOrgId:
type: string
description: portfolio parent org ID
example: 588f7ee98f138b19220041a7
startDate:
type: string
format: date
description: start date of history
options:
description: org-public options
$ref: '#/components/schemas/OrgOptions'
internalOptions:
description: internal (ChartHop controlled) options
$ref: '#/components/schemas/InternalOrgOptions'
onboarding:
type: boolean
description: current onboarding status of an organization, allowing clearing of org
selfServeImporting:
type: boolean
description: completion status of initial import for orgs signed up via self serve
headCount:
type: integer
format: int32
description: number of total headcount currently in the org
userCount:
type: integer
format: int32
description: number of non-ChartHop, non-app users in the org
activeUserCount:
type: integer
format: int32
description: number of non-ChartHop, non-app users in the org active in the past month
activeAt:
type: string
description: last timestamp that any user was active in the org
example: '2017-01-24T13:57:52Z'
createId:
type: string
description: created by user id
example: 588f7ee98f138b19220041a7
createBehalfId:
type: string
description: created on behalf of user id
example: 588f7ee98f138b19220041a7
createAttribution:
$ref: '#/components/schemas/Attribution'
createAt:
type: string
description: created timestamp
example: '2017-01-24T13:57:52Z'
updateId:
type: string
description: last updated by user id
example: 588f7ee98f138b19220041a7
updateBehalfId:
type: string
description: last updated on behalf of user id
example: 588f7ee98f138b19220041a7
updateAttribution:
$ref: '#/components/schemas/Attribution'
updateAt:
type: string
description: last updated timestamp
example: '2017-01-24T13:57:52Z'
destroyAt:
type: string
description: timestamp that the org is marked for data destruction
readOnly: true
example: '2017-01-24T13:57:52Z'
destroyId:
type: string
description: user who marked the org for data destruction
readOnly: true
example: 588f7ee98f138b19220041a7
destroyedAt:
type: string
description: date at which this org was destroyed, can not be modified
readOnly: true
LayoutButton:
type: object
required:
- url
- label
properties:
url:
type: string
label:
type: string
Geopoint:
type: object
required:
- type
- coordinates
properties:
type:
type: string
description: Type of point
readOnly: true
coordinates:
type: array
description: The longitude and latitude of the point
readOnly: true
items:
type: number
format: double
MessageChannelConfig:
type: object
required:
- channels
- alwaysEmail
properties:
channels:
type: array
items:
type: string
enum:
- EMAIL
- CHAT
- CHAT_SLACK
- CHAT_TEAMS
alwaysEmail:
type: boolean
TrialProduct:
type: object
required:
- productId
- startDate
- endDate
properties:
productId:
type: string
description: id of the product the customer is trialing
example: 588f7ee98f138b19220041a7
startDate:
type: string
format: date
description: first date the trial grants access (inclusive)
endDate:
type: string
format: date
description: last date the trial grants access (inclusive)
FeatureAccessOption:
type: object
required:
- name
- type
properties:
name:
type: string
description: The name of the feature option tied to the feature access
example: smart_fields
enum:
- CONFIGURED_ROLES
- SMART_FIELDS
- APP_FIELD_MAPPERS
- MULTI_PAYROLL_INSTALLS
description:
type: string
description: The description of the feature option
type:
type: string
description: The feature option type
enum:
- LIMIT
- FULL_ACCESS
limit:
type: integer
format: int32
description: The feature option limit
OrgDomain:
type: object
required:
- domain
- aliases
properties:
domain:
type: string
aliases:
type: array
uniqueItems: true
items:
type: string
Customer:
type: object
required:
- id
- name
- status
properties:
id:
type: string
description: unique id of customer
example: 588f7ee98f138b19220041a7
name:
type: string
description: name of customer
email:
type: string
description: email address for billing purposes
billAddress:
description: mailing address for billing purposes
$ref: '#/components/schemas/Address'
industry:
type: string
description: industry that customer is in
source:
type: string
description: source of customer signup
enum:
- ADP_MARKETPLACE
- SELF_SERVE
- SELF_SERVE_TEST
- SEQUOIA_ONE
- CONNECT
status:
type: string
description: current status
enum:
- ACTIVE
- INACTIVE
- TRIAL
- CHURN
- PAYMENT_ERROR
stripeCustomerId:
type: string
description: stripe customer id
salesforceAccountId:
type: string
description: salesforce account id
pattern: ^[a-zA-Z0-9]{15}|[a-zA-Z0-9]{18}$
products:
type: array
description: products that this customer has purchased
items:
$ref: '#/components/schemas/ProductItem'
trialProducts:
type: array
description: products this customer has temporary trial access to, each bounded by a date range
items:
$ref: '#/components/schemas/TrialProduct'
restrictedFeatures:
type: array
description: features that are restricted for the customer
items:
type: string
enum:
- AI_ACTION
- AI_AGENT
- AI_API_WRITE
- AI_SLACK_TEAM_CHAT
- ATS_SYNC
- BUDGET
- COMPENSATION_REVIEW
- CUSTOM_CALENDAR
- CUSTOM_FIELD
- CUSTOM_FIELD_READONLY
- CUSTOM_FORM
- CUSTOM_PROFILE_TAB
- CUSTOM_ROLE
- FORM_ANONYMOUS
- FORM_RELEASE
- FORM_SIGNATURE
- GOAL
- MULTI_PAYROLL
- PERFORMANCE_REVIEW
- REPORT
- REPORT_READONLY
- SCENARIO
- SIGNATURE
- SIGNATURE_QES
- SIMPLE_WORKFLOWS
- SURVEY
- TABLE
- TEMPLATE
- WORKDAY_ADAPTIVE
- PAYROLL_OUTBOUND
- APPROVAL_WORKFLOWS
- CONTENT
- IDENTITY_OUTBOUND
- ONBOARDING_OFFBOARDING
- TIMEOFF
featureOptionOverrides:
type: array
description: override feature options for the customer
items:
$ref: '#/components/schemas/FeatureAccessOption'
startDate:
type: string
format: date
description: initial date of billing
endDate:
type: string
format: date
description: end of service date for churning customers -- on or after this date, service should be disabled
nextInvoiceDate:
type: string
format: date
description: date of next invoice
orgCount:
type: integer
format: int32
description: number of orgs covered by this customer
primaryHeadCount:
type: integer
format: int32
description: number of total headcount across all orgs
secondaryHeadCount:
type: integer
format: int32
description: number of total headcount across all orgs
tertiaryHeadCount:
type: integer
format: int32
description: number of total headcount across all orgs
primaryHeadCountFilter:
type: string
description: primary headcount filter - used for billing purposes
secondaryHeadCountFilter:
type: string
description: secondary headcount filter - used for billing purposes
tertiaryHeadCountFilter:
type: string
description: tertiary headcount filter - used for billing purposes
arr:
type: number
description: current ARR of the customer based on most recent invoice
trialStartDate:
type: string
format: date
description: date this customer begins their trial period
trialEndDate:
type: string
format: date
description: date this customer ends their trial period
stripeSubscriptionSync:
type: string
description: Stripe subscription settings
enum:
- SYNC
- DELETE
createAt:
type: string
description: created timestamp
example: '2017-01-24T13:57:52Z'
createId:
type: string
description: created by
example: 588f7ee98f138b19220041a7
createBehalfId:
type: string
description: created on behalf of user id
example: 588f7ee98f138b19220041a7
createAttribution:
$ref: '#/components/schemas/Attribution'
updateAt:
type: string
description: updated timestamp
example: '2017-01-24T13:57:52Z'
updateId:
type: string
description: updated by
example: 588f7ee98f138b19220041a7
updateBehalfId:
type: string
description: last updated on behalf of user id
example: 588f7ee98f138b19220041a7
updateAttribution:
$ref: '#/components/schemas/Attribution'
LayoutRow:
type: object
required:
- columns
- format
properties:
columns:
type: array
items:
$ref: '#/components/schemas/LayoutColumn'
format:
type: string
Attribution:
type: object
properties:
principalUserId:
type: string
example: 588f7ee98f138b19220041a7
agentUserIds:
type: array
items:
type: string
example: 588f7ee98f138b19220041a7
eventId:
type: string
example: 588f7ee98f138b19220041a7
aiChatId:
type: string
example: 588f7ee98f138b19220041a7
aiToolUseId:
type: string
channel:
type: string
enum:
- WEB
- MOBILE
- SLACK
- TEAMS
- MCP
Block:
type: object
properties:
type:
type: string
description: the type of this block, or null if legacy
enum:
- CONTENT
- TASK
- CALENDAR
label:
type: string
description: human readable label for this block
height:
type: object
description: fixed height in px, or expand if “stretch”, or fit to contents if null
targetFilter:
type: string
description: filter condition expression applied to this block, used to determine whether the content appears on the target or not
readFilter:
type: string
description: filter condition expression applied to this block, relative to the viewer
formIds:
type: array
description: form ids to surface responses in this block
uniqueItems: true
items:
type: string
example: 588f7ee98f138b19220041a7
fields:
type: array
description: fields retrieved in this block
items:
type: string
title:
type: string
description: title to show in block header
content:
type: string
description: template content returned in this block
contentTr:
description: template content returned in this block, translated
$ref: '#/components/schemas/Translations'
primaryButton:
description: primary CTA button
$ref: '#/components/schemas/LayoutButton'
secondaryButton:
description: secondary CTA button
$ref: '#/components/schemas/LayoutButton'
OrgOptions:
type: object
properties:
costMultiplier:
type: number
description: Blanket multiplier to apply to all headcount costs, to account for blanket costs such as taxes and benefits
orgEngineIncrementalBackDays:
type: integer
format: int32
description: Org engine incremental back day option
stockPriceRollingAverage:
type: integer
format: int32
bannerMessageExpireDays:
type: integer
format: int32
dashboardChangeDaysAhead:
type: integer
format: int32
description: How many days ahead to look for changes on home screen
dashboardChangeDaysBack:
type: integer
format: int32
description: How many days back to look for changes on home screen
dashboardChangeDaysAheadMembers:
type: integer
format: int32
description: How many days ahead to look for changes, for members only — i.e. set this to 0 to disallow regular people seeing in the future
dashboardAnniversariesDaysBack:
type: integer
format: int32
dashboardAnniversariesDaysAhead:
type: integer
format: int32
maxDateYears:
type: integer
format: int32
description: The max number of years ahead shown in date inputs, defaults to 20 years
dashboardGlobal:
type: boolean
description: If you want employees to see all jobs regardless of location set this to true
dashboardHidePeopleMoves:
type: boolean
dashboardHideOpenJobs:
type: boolean
dashboardRestrictOpenJobs:
type: boolean
dashboardHideAnniversaries:
type: boolean
dashboardHideWeeklyCalendar:
type: boolean
description: Hides the weekly calendar widget on the home screen
dashboardWeeklyCalendarIncludeWeekends:
type: boolean
description: Includes weekends in the weekly calendar widget
placesDecimal:
type: integer
format: int32
placesMoney:
type: integer
format: int32
placesPercent:
type: integer
format: int32
placesPayYearly:
type: integer
format: int32
placesPayHourly:
type: integer
format: int32
placesVariableAmount:
type: integer
format: int32
placesVariablePercent:
type: integer
format: int32
disableCompReviewV2Emails:
type: boolean
disableDataAggregation:
type: boolean
disableDataImportTypes:
type: boolean
disableLiveQuery:
type: boolean
disableWelcomeEmail:
type: boolean
disableOrgExportLimit:
type: boolean
description: Allows powerpoint exports of over 1000 jobs
disableApproverScenarioEdits:
type: boolean
description: Disables ability of approvers to modify scenario data
enableActions:
type: boolean
enableAdp:
type: boolean
enableAzure:
type: boolean
enableBackwardsCompatibleCompBandRead:
type: boolean
description: Backwards compatibility flags for bands UAC
enableColumnCacheLogging:
type: boolean
enableColumnCacheInRedis:
type: boolean
enableTimeOffCacheInRedis:
type: boolean
enableStockGrantCacheInRedis:
type: boolean
enableMapForScenarios:
type: boolean
enablePositionEligibilityFilter:
type: boolean
description: Enables the CQL eligibility filter input on Group Type position rows
enableCompChangeCacheInRedis:
type: boolean
enableCompReviewV2LaunchFlag:
type: boolean
enableExperimentalScreenshotLayoutChanges:
type: boolean
enableGoogle:
type: boolean
enableMicrosoft:
type: boolean
enableOkta:
type: boolean
enableOneLogin:
type: boolean
enablePassword:
type: boolean
enableStartingSalary:
type: boolean
description: Enable starting salary configuration for comp bands
enableDynamicFields:
type: boolean
description: Enable dynamic fields configuration for job codes
enableDynamicJobDialog:
type: boolean
description: Enable dynamic fields configuration in the job modal
enableDynamicOrgChartCardHeight:
type: boolean
description: Enables dynamic card height on the org chart to optimize layout based on card content
linkedJobUpdateExcludedCategories:
type: array
description: Field categories excluded from linked field updates on filled jobs. Defaults to compensation categories if null.
uniqueItems: true
items:
type: string
example: 588f7ee98f138b19220041a7
jobDialogFilterJobCodeFieldId:
type: string
description: Determines which field to filter job codes by in the job dialog, defaults to department
example: 588f7ee98f138b19220041a7
enablePerOrgAuth:
type: boolean
enableRickrollLogin:
type: boolean
enableSaml:
type: boolean
disableSamlLoginToken:
type: boolean
enableTemplatesRichTextEditorV2:
type: boolean
enableOrgEngineRequiredFields:
type: boolean
description: Configures Org Engine to respect required fields
enableLongLivedCache:
type: boolean
description: Enables a managed service that, on API startup, primes those orgs' caches, for both column cache, as well as the primary org cache. These keys should also last for 24+ hours and therefore be always kept warm.
grantValueDefault:
type: boolean
description: If enabled, then by default grants are in value, not shares
orgEnginePromoteCustomIdsAsTrueIds:
type: boolean
description: This field promotes the alternate id to the true id and allows HRIS to be updated
preventAtsEmailNotifications:
type: boolean
description: Sync History V2 Option to prevent ATS notifications
scenarioCols:
type: string
description: The default set of comma separated columns to show in the scenario changes screen
enablePowerpointScreenshot:
type: boolean
description: Enables the powerpoint screenshot export feature, on by default
enableDelightedSurvey:
type: boolean
description: Enables the delighted survey popup
enableOrgChartIndicators:
type: boolean
description: Shows the +XX job sibling indicators on the org chart
enableHideEquityCalculator:
type: boolean
description: Hides the value calculator on the equity section of the profile
enableTransformFieldMapper:
type: boolean
description: Enables the ability to configure the One to One field mapper with a Charthop Default Value
enableFullNamesTitlesLegacy:
type: boolean
d
# --- truncated at 32 KB (54 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/charthop/refs/heads/main/openapi/charthop-billing-api-openapi.yml