Stable Pro

Stable Pro API · v1

Endpoints et objets

Chaque endpoint avec son autorisation, ses paramètres et sa réponse, et chaque objet avec ses champs. Généré à partir du contrat OpenAPI.

Les noms des champs, les codes et les valeurs sont le contrat : ils sont identiques dans toutes les langues. Les descriptions sont traduites.

Endpoints

GET/api/v1/connection

La connexion de la clé appelante : nom, autorisations et la clé elle-même (jamais le secret)

Autorisation
toute clé valide
Paramètres
lang
Réponse
Connection
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/codes

Le dictionnaire de tous les codes que renvoie l'API, avec les noms dans la langue demandée (?lang=, Accept-Language)

Autorisation
toute clé valide
Paramètres
lang
Réponse
Codes
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/organization

L'écurie de la clé appelante : nom, pays, devise, fuseau horaire, langue, si Stable Pro calcule les taxes

Autorisation
toute clé valide
Paramètres
lang
Réponse
Organization
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/customers

Tous ceux qui ont au moins un débit, payé ou non, membre ou personnel ; avec customers.fiscal:read, aussi les données de facturation

Autorisation
customers:read
Paramètres
langlimitstarting_after
Réponse
CustomerList
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/customers/{id}

Un client ; avec customers.fiscal:read, aussi les données de facturation. D'une autre écurie : 404

Autorisation
customers:read
Paramètres
id (dans le chemin)lang
Réponse
Customer
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/customers/{id}/balance

Ce que le client doit aujourd'hui, ce qui viendra plus tard, et le crédit qu'il peut utiliser

Autorisation
charges:read
Paramètres
id (dans le chemin)lang
Réponse
Balance
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/charges

Tous les débits aux clients, payés ou non (jamais la rémunération du personnel)

Autorisation
charges:read
Paramètres
langlimitstarting_after
Filtres
  • customer — Uniquement ce client (son identifiant)
  • accounting_month — Uniquement ce mois comptable (YYYY-MM) : le mois où le fait compte, voir Conventions
Réponse
ChargeList
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/charges/{id}

Un débit, tel qu'il est maintenant : montant et taxes sont la naissance plus les corrections plus les changements de taxe

Autorisation
charges:read
Paramètres
id (dans le chemin)lang
Réponse
Charge
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/adjustments

Corrections des débits

Autorisation
charges:read
Paramètres
langlimitstarting_after
Filtres
  • charge — Uniquement les corrections de ce débit (son identifiant)
  • accounting_month — Uniquement ce mois comptable (YYYY-MM) : le mois où le fait compte, voir Conventions
Réponse
AdjustmentList
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/adjustments/{id}

Une correction : action, reason, category, montant signé, consideration_effect, la différence de taxe

Autorisation
charges:read
Paramètres
id (dans le chemin)lang
Réponse
Adjustment
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/payments

Mouvements d'argent des clients (encaissements, remboursements, contre-passations, crédit utilisé)

Autorisation
payments:read
Paramètres
langlimitstarting_after
Filtres
  • customer — Uniquement ce client (son identifiant)
Réponse
PaymentList
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/payments/{id}

Un mouvement d'argent, avec ses affectations ; qui a payé pour le compte du client

Autorisation
payments:read
Paramètres
id (dans le chemin)lang
Réponse
Payment
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/allocations/{id}

Quelle part d'un mouvement va à un débit, signée

Autorisation
payments:read
Paramètres
id (dans le chemin)lang
Réponse
Allocation
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/credit-entries

Mouvements du crédit des clients (créé, augmenté, utilisé, remboursé)

Autorisation
payments:read
Paramètres
langlimitstarting_after
Filtres
  • customer — Uniquement ce client (son identifiant)
Réponse
CreditEntryList
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/credit-entries/{id}

Un mouvement du crédit d'un client

Autorisation
payments:read
Paramètres
id (dans le chemin)lang
Réponse
CreditEntry
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/receipts

Reçus de Stable Pro (R : reçus de paiement, RB : confirmations de remboursement), dans l'ordre d'émission ; jamais des documents fiscaux

Autorisation
receipts:read
Paramètres
langlimitstarting_after
Filtres
  • customer — Uniquement ce client (son identifiant)
  • payment — Uniquement les reçus de ce mouvement d'argent (son identifiant)
Réponse
ReceiptList
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/receipts/{id}

Un reçu : type, le numéro tel qu'imprimé, statut, le paiement qu'il confirme, le montant figé

Autorisation
receipts:read
Paramètres
id (dans le chemin)lang
Réponse
Receipt
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/receipts/{id}/pdf

Le PDF du reçu, le même que celui qu'a reçu le client. Quand il porte les données fiscales de qui a payé pour le compte du client, il faut aussi customers.fiscal:read (sinon 403)

Autorisation
receipts:read
Paramètres
id (dans le chemin)lang
Réponse
application/pdf
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/events

Ce qui s'est passé, dans l'ordre : lisez après votre curseur pour rester synchronisé. Chaque événement demande l'autorisation de l'objet vers lequel il pointe. Pendant le chargement de l'historique de l'écurie : 503 events-not-ready

Autorisation
toute clé valide
Paramètres
langlimitafter
Réponse
EventList
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/events/{id}

Un événement. D'une autre écurie, ou d'un type que votre clé ne lit pas : 404

Autorisation
toute clé valide
Paramètres
id (dans le chemin)lang
Réponse
Event
Erreurs
400 · 401 · 403 · 404 · 429 · 500 · 503

Objets

Problem

ChampTypeDescription
typestring (uri)Stable, en anglais : décidez selon ceci, pas selon le texte
titlestringEn anglais
statusinteger
detailstring · facultatifUne phrase destinée aux personnes, dans la langue demandée (?lang=, Accept-Language)
reasonstring · facultatif
missing · malformed · wrong_environment · unknown · connection_revoked · revoked · expired · rotated
401 uniquement : pourquoi la clé n'est pas valide
missing_permissionstring · facultatif
charges:read · payments:read · receipts:read · customers:read · customers.fiscal:read · external-documents:write
403 forbidden uniquement
invalid_paramstring · facultatif400 uniquement : le paramètre qui n'est pas valide

Connection

ChampTypeDescription
object"connection"
idstring (uuid)
namestring
permissionstableau de string
created_atstring (date-time)RFC 3339, UTC
keyobject
key.idstring (uuid)
key.last_fourstring
key.environmentstring
live · test
live = production (sp_live_), test = staging (sp_test_)
key.created_atstring (date-time)RFC 3339, UTC
key.expires_atstring (date-time) · peut être nullRFC 3339, UTC
key.retires_atstring (date-time) · peut être nullAprès une rotation : quand cette clé cesse de fonctionner

Organization

ChampTypeDescription
object"organization"
idstring (uuid)
namestring
legal_namestring · peut être null
countrystring · peut être nullISO 3166-1 alpha-2
currencystringISO 4217
timezonestringIANA
languagestringLa langue de l'écurie : Stable Pro ne connaît pas celle de chaque client
localestringBCP 47, pour la mise en forme
taxesobject
taxes.calculated_bystring
stable_pro · external
external = Stable Pro ne calcule pas les taxes ce mois-ci : rien de plus
taxes.amount_basis"gross"Chaque montant est le total que paie le client
receipts_shown_to_customersbooleanfalse : l'écurie a choisi de ne pas donner les reçus de Stable Pro à ses clients tant qu'un logiciel est connecté ; ils existent quand même et sont numérotés (GET /receipts)

Customer

ChampTypeDescription
object"customer"
idstring (uuid)Le code du client : il ne change jamais
kindstring
member · staff
namestring
given_namestring · peut être null
family_namestring · peut être null
activebooleanfalse : a quitté l'écurie, ou a été retiré ; ses débits restent facturables
created_atstring (date-time)RFC 3339, UTC
billing_addressobject · peut être null · facultatifUniquement avec customers.fiscal:read
billing_address.line1string · peut être null
billing_address.line2string · peut être null
billing_address.postal_codestring · peut être null
billing_address.citystring · peut être null
billing_address.subdivisionstring · peut être nullISO 3166-2 (IT-MI, US-OH)
billing_address.countrystring · peut être nullISO 3166-1 alpha-2
billing_address_textstring · peut être null · facultatifUniquement avec customers.fiscal:read : l'ancienne adresse en texte libre, seulement tant que billing_address est vide
tax_identifierstableau de object · facultatifUniquement avec customers.fiscal:read
tax_identifiers[].schemestringVAT, ou un ICD ISO 6523 (0210 code fiscal italien, 0211 numéro de TVA italien)
tax_identifiers[].valuestring
tax_codestring · peut être null · facultatifUniquement avec customers.fiscal:read : l'ancien code fiscal, sans schéma

CustomerList

ChampTypeDescription
object"list"
datatableau de Customer
has_morebooleanIl y a une page suivante : redemandez avec starting_after = l'identifiant du dernier élément

Balance

ChampTypeDescription
object"balance"
customer_idstring (uuid)
currencystring
amount_dueintegerCe qui est dû aujourd'hui : débits déjà visibles
amount_scheduledintegerDébits qui deviendront visibles plus tard
creditintegerCrédit utilisable sur un débit
as_ofstring (date)Aujourd'hui, dans le fuseau horaire de l'écurie

Charge

ChampTypeDescription
object"charge"
idstring (uuid)
customer_idstring (uuid)
typestringListe ouverte : boarding, service_charge, lesson_drop_in, lesson_plan, health_record, …
descriptionstringTel que l'écurie l'a écrit
period_startstring (date)YYYY-MM-DD
period_endstring (date)YYYY-MM-DD
competence_monthstringYYYY-MM
accounting_monthstringLe plus tardif entre le mois de rattachement et celui d'enregistrement : calculé par Stable Pro
due_datestring (date)YYYY-MM-DD
visible_fromstring (date)YYYY-MM-DD
quantity"1"
unitstring
MON · ANN · C62
UNECE Rec. 20
unit_amountintegerUnités mineures de la devise (ISO 4217)
currencystring
original_amountintegerÀ la naissance
amountintegerMaintenant : la naissance plus les corrections
amount_paidintegerUnités mineures de la devise (ISO 4217)
amount_remainingintegerUnités mineures de la devise (ISO 4217)
amount_basis"gross"
tax_calculated_bystring
stable_pro · external
tax_treatmentstring
standard_rated · zero_rated · not_calculated · undetermined
taxable_amountintegerUnités mineures de la devise (ISO 4217)
taxestableau de object
taxes[].type"vat"Liste ouverte : d'autres types peuvent arriver
taxes[].jurisdictionstring · peut être nullISO 3166-1 alpha-2 de l'écurie
taxes[].categorystring · peut être nullUNCL 5305 : S, Z, E, AE, K, G, O ; null si elle n'est pas déclarée
taxes[].rate_bpintegerPoints de base : 2200 = 22 %
taxes[].amountintegerUnités mineures de la devise
taxes[].exemption_reasonstring · peut être null · facultatifBT-120, uniquement au taux zéro
taxes[].exemption_reason_codestring · peut être null · facultatifVATEX (BT-121), uniquement au taux zéro
created_atstring (date-time)RFC 3339, UTC

ChargeList

ChampTypeDescription
object"list"
datatableau de Charge
has_morebooleanIl y a une page suivante : redemandez avec starting_after = l'identifiant du dernier élément

Adjustment

ChampTypeDescription
object"adjustment"
idstring (uuid)
charge_idstring (uuid)
customer_idstring (uuid)
direction"receivable"
actionstring · peut être nullListe ouverte de codes (voir /codes)
reasonstring · peut être null
categorystring · peut être null
originstring · peut être nullHUMAN, SYSTEM, …
amountintegerSigné : négatif réduit le débit
consideration_effectstring
changes · none
changes : un avoir (ou une note de débit) suit ; none : une perte sur créance, sans taxe
taxestableau de objectAvec changes : la différence de taxe, déjà calculée. Avec none : vide
taxes[].type"vat"Liste ouverte : d'autres types peuvent arriver
taxes[].jurisdictionstring · peut être nullISO 3166-1 alpha-2 de l'écurie
taxes[].categorystring · peut être nullUNCL 5305 : S, Z, E, AE, K, G, O ; null si elle n'est pas déclarée
taxes[].rate_bpintegerPoints de base : 2200 = 22 %
taxes[].amountintegerUnités mineures de la devise
taxes[].exemption_reasonstring · peut être null · facultatifBT-120, uniquement au taux zéro
taxes[].exemption_reason_codestring · peut être null · facultatifVATEX (BT-121), uniquement au taux zéro
taxable_amountinteger · peut être nullUnités mineures de la devise (ISO 4217)
currencystring
competence_monthstringYYYY-MM
accounting_monthstringYYYY-MM
occurred_atstring (date-time)RFC 3339, UTC
reverses_adjustment_idstring (uuid) · peut être null
taxonomy_versioninteger

AdjustmentList

ChampTypeDescription
object"list"
datatableau de Adjustment
has_morebooleanIl y a une page suivante : redemandez avec starting_after = l'identifiant du dernier élément

Allocation

ChampTypeDescription
object"allocation"
idstring (uuid)
payment_idstring (uuid)
charge_idstring (uuid)
amountintegerSigné
currencystring · facultatif
consideration_effect"none"

Payment

ChampTypeDescription
object"payment"
idstring (uuid)
customer_idstring (uuid) · peut être null
typestring
payment · credit_applied · offset · refund · moved_to_credit · reversal
Ce qui est arrivé à l'argent (liste ouverte)
amountintegerL'argent qui a réellement bougé, signé : un remboursement ou une contre-passation est négatif, moved_to_credit vaut zéro
currencystring
datestring (date)YYYY-MM-DD
accounting_monthstringYYYY-MM
methodstringcash, bank_transfer, pos, credit, compensazione, other (liste ouverte)
referencestring · peut être null
paid_byobject · peut être nullQui a payé pour le compte du client (un parent) : pas un client à part entière
paid_by.kindstring · peut être null
paid_by.namestring · peut être null
paid_by.tax_codestring · peut être null · facultatifUniquement avec customers.fiscal:read
paid_by.address_textstring · peut être null · facultatifUniquement avec customers.fiscal:read
reverses_payment_idstring (uuid) · peut être null
actionstring · peut être nullUniquement pour les contre-passations
reasonstring · peut être null
categorystring · peut être null
consideration_effect"none"
allocationstableau de Allocation
taxonomy_versioninteger · peut être null
created_atstring (date-time)RFC 3339, UTC

PaymentList

ChampTypeDescription
object"list"
datatableau de Payment
has_morebooleanIl y a une page suivante : redemandez avec starting_after = l'identifiant du dernier élément

CreditEntry

ChampTypeDescription
object"credit_entry"
idstring (uuid)
customer_idstring (uuid)
directionstring
credit · debit
credit : le crédit naît ou augmente ; debit : il est utilisé ou remboursé
amountintegerToujours positif : direction indique le sens
currencystring
sourcestringListe ouverte de codes
payment_idstring (uuid) · peut être nullLe mouvement qui l'a causé
charge_idstring (uuid) · peut être null
actionstring · peut être null
reasonstring · peut être null
categorystring · peut être null
reverses_entry_idstring (uuid) · peut être null
consideration_effect"none"
created_atstring (date-time)RFC 3339, UTC

CreditEntryList

ChampTypeDescription
object"list"
datatableau de CreditEntry
has_morebooleanIl y a une page suivante : redemandez avec starting_after = l'identifiant du dernier élément

Receipt

ChampTypeDescription
object"receipt"
idstring (uuid)
kindstring
payment_receipt · refund_confirmation
payment_receipt : série R, argent reçu ; refund_confirmation : série RB, argent remboursé (liste ouverte)
seriesstringR, RB (liste ouverte) : chaque série a sa propre numérotation
yearinteger
sequenceintegerNuméro progressif au sein de la série et de l'année, sans trous
numberstringLe numéro tel qu'imprimé sur le document
statusstring
issued · voided
Un reçu annulé reste, avec son numéro
issued_atstring (date-time)RFC 3339, UTC
voided_atstring (date-time) · peut être nullRFC 3339, UTC
operation_typestring · peut être nullUniquement pour les confirmations de remboursement : voluntary_refund, payment_reversal, chargeback (liste ouverte)
payment_idstring (uuid) · peut être nullL'encaissement, ou le remboursement, que le reçu confirme
charge_idstring (uuid) · peut être nullUniquement les reçus de l'ancien modèle, émis sur un débit au lieu d'un encaissement
customer_idstring (uuid) · peut être null
amountinteger · peut être nullTel que figé sur le document, signé : une confirmation de remboursement est négative
currencystring
pdf_availablebooleanfalse uniquement pour les reçus les plus anciens, émis avant les documents figés : pas de feuille à réimprimer
fiscal_document"false"Une confirmation de paiement : le document fiscal est émis par votre logiciel

ReceiptList

ChampTypeDescription
object"list"
datatableau de Receipt
has_morebooleanIl y a une page suivante : redemandez avec starting_after = l'identifiant du dernier élément

Event

ChampTypeDescription
object"event"
idstring (uuid)Stable, unique entre toutes les écuries : utilisez-le pour reconnaître un événement déjà traité
typestringListe ouverte : customer.updated, charge.created, charge.due_date_changed, charge.tax_changed, adjustment.created, payment.created, allocation.created, credit_entry.created, receipt.issued, receipt.voided
dataobject
data.objectstringListe ouverte : customer, charge, adjustment, payment, allocation, credit_entry, receipt
data.idstring (uuid)
data.urlstringOù le lire, à partir de l'hôte : /api/v1/charges/{id}
occurred_atstring (date-time)Quand le fait s'est produit : l'heure de création, d'émission ou d'annulation ; pour un changement de taxe, sa création
recorded_atstring (date-time)Quand l'événement a été écrit : pour les événements historiques, le jour où l'historique a été chargé
historicalbooleantrue : un fait antérieur à l'existence des événements, chargé une fois, classé par sa date

EventList

ChampTypeDescription
object"list"
datatableau de Event
has_morebooleanRedemandez avec after = next_cursor. Une page peut contenir moins d'événements que limit, voire aucun, alors que has_more vaut true
next_cursorstring (uuid) · peut être nullEnregistrez-le après avoir traité la page, et renvoyez-le comme after. Il peut être l'identifiant d'un événement qui ne vous est pas montré. null uniquement quand l'écurie n'a encore aucun événement pour vous

Codes

ChampTypeDescription
object"codes"
languagestringLa langue des noms : ?lang=, puis Accept-Language, puis en
taxonomy_versionintegerLa taxonomie dont viennent action, reason et category
listsobject
lists.charge_typeobject
lists.charge_type.fieldstableau de stringOù ces codes apparaissent : resource.field
lists.charge_type.codestableau de object
lists.charge_type.codes[].codestring
lists.charge_type.codes[].namestring
lists.actionobject
lists.action.fieldstableau de stringOù ces codes apparaissent : resource.field
lists.action.codestableau de object
lists.action.codes[].codestring
lists.action.codes[].namestring
lists.reasonobject
lists.reason.fieldstableau de stringOù ces codes apparaissent : resource.field
lists.reason.codestableau de object
lists.reason.codes[].codestring
lists.reason.codes[].namestring
lists.reason.codes[].actionstringLe nom d'un reason dépend de son action : cherchez-le avec les deux
lists.reason.codes[].categorystring
lists.categoryobject
lists.category.fieldstableau de stringOù ces codes apparaissent : resource.field
lists.category.codestableau de object
lists.category.codes[].codestring
lists.category.codes[].namestring
lists.originobject
lists.origin.fieldstableau de stringOù ces codes apparaissent : resource.field
lists.origin.codestableau de object
lists.origin.codes[].codestring
lists.origin.codes[].namestring
lists.payment_typeobject
lists.payment_type.fieldstableau de stringOù ces codes apparaissent : resource.field
lists.payment_type.codestableau de object
lists.payment_type.codes[].codestring
lists.payment_type.codes[].namestring
lists.payment_methodobject
lists.payment_method.fieldstableau de stringOù ces codes apparaissent : resource.field
lists.payment_method.codestableau de object
lists.payment_method.codes[].codestring
lists.payment_method.codes[].namestring
lists.credit_sourceobject
lists.credit_source.fieldstableau de stringOù ces codes apparaissent : resource.field
lists.credit_source.codestableau de object
lists.credit_source.codes[].codestring
lists.credit_source.codes[].namestring
lists.receipt_kindobject
lists.receipt_kind.fieldstableau de stringOù ces codes apparaissent : resource.field
lists.receipt_kind.codestableau de object
lists.receipt_kind.codes[].codestring
lists.receipt_kind.codes[].namestring
lists.refund_operationobject
lists.refund_operation.fieldstableau de stringOù ces codes apparaissent : resource.field
lists.refund_operation.codestableau de object
lists.refund_operation.codes[].codestring
lists.refund_operation.codes[].namestring
lists.tax_categoryobjectUNCL 5305
lists.tax_category.fieldstableau de stringOù ces codes apparaissent : resource.field
lists.tax_category.codestableau de object
lists.tax_category.codes[].codestring
lists.tax_category.codes[].namestring
lists.unitobjectUNECE Rec. 20
lists.unit.fieldstableau de stringOù ces codes apparaissent : resource.field
lists.unit.codestableau de object
lists.unit.codes[].codestring
lists.unit.codes[].namestring
lists.event_typeobject
lists.event_type.fieldstableau de stringOù ces codes apparaissent : resource.field
lists.event_type.codestableau de object
lists.event_type.codes[].codestring
lists.event_type.codes[].namestring