Référence API

API Facturation

Forfaits, soldes de crédits et relevés

Référence HTTP. Générée à partir du contrat backend. Parcourez les points de terminaison ci-dessous ou téléchargez OpenAPI.

Ce groupe compte 6 opérations, générées à partir de api/openapi.yaml. Filtrez par chemin, action ou authentification. Chaque point de terminaison liste ses entrées ; développez-le pour voir un modèle de requête et les codes de réponse. Les modèles demandent vos propres valeurs et un corps conforme au schéma.

Remplacez les espaces réservés en majuscules par vos valeurs. Pour une requête JSON, enregistrez un corps correspondant au schéma dans request.json. Les exemples de cookies utilisent un pot à cookies local issu d’une session authentifiée.

Forfaits, soldes de crédits et relevés

GET/api/billing/balance

Obtenir le solde de facturation

Le snapshot du solde conscient de la source du projet appelant. Tous les montants en millicrédits sont des chaînes décimales canoniques. C’est un snapshot, pas une autorité de paiement ; rails_available est faux tant que la carte, la taxe et la voie de retrait sont indisponibles.

Authentification
projectBearer OU dashboardSession
Corps de la requête
aucun
ID d’opération
getBillingBalance

Paramètres

NomEnvoyerRequis ?Description
ScreenRig-Projecten-têteoptionnelObsolète pour une version. Doit être cohérent avec les droits JWT des projets ; ajoute les en-têtes Deprecation et Warning. Pas d’échange de jeton.
Modèle de requête et réponses
shell · modèle de requête
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/billing/balance'

Réponses

StatutSensCorps et en-têtes
200Instantané du solde.BillingBalance (application/json)
par défaut

Réponse stable RFC 9457 à un problème. Un 421 server_draining porte un Retry-After de 1 seconde, un 500 not_ready ou dependency_unavailable porte 5, et un 500 manifest_degraded porte 60, sauf si le gestionnaire a défini une valeur plus spécifique.

Problème (application/problem+json)
GET/api/billing/statement

Obtenir le relevé de facturation

Pagination stable par curseur sur les entrées de journal immuables publiées pour le projet appelant. Les retenues ne sont pas des entrées publiées. Les corrections renvoient à l’événement original au lieu de le réécrire. Il n’y a aucune mutation arbitraire de subvention ou de paiement sur cette surface.

Authentification
projectBearer OU dashboardSession
Corps de la requête
aucun
ID d’opération
getBillingStatement

Paramètres

NomEnvoyerRequis ?Description
ScreenRig-Projecten-têteoptionnelObsolète pour une version. Doit être cohérent avec les droits JWT des projets ; ajoute les en-têtes Deprecation et Warning. Pas d’échange de jeton.
curseurrequêteoptionnel
limiterequêteoptionnel
Modèle de requête et réponses
shell · modèle de requête
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/billing/statement'

Réponses

StatutSensCorps et en-têtes
200Page de relevé.BillingStatement (application/json)
400invalid_request - limite hors plage.Problème (application/problem+json)
par défaut

Réponse stable RFC 9457 à un problème. Un 421 server_draining porte un Retry-After de 1 seconde, un 500 not_ready ou dependency_unavailable porte 5, et un 500 manifest_degraded porte 60, sauf si le gestionnaire a défini une valeur plus spécifique.

Problème (application/problem+json)
GET/api/billing/usage

Obtenir l’utilisation de facturation

L’utilisation du projet appelant pour un mois UTC, avec les octets servis et reçus (jamais facturés), le stockage facturé au-delà du stockage gratuit du forfait du payeur (allowance.storage_bytes), et les requêtes API, les événements de flux de projet facturés et les tentatives de livraison par webhook comptés dans la limite gratuite de 10 000 par mois. Un projet qui paie pour lui-même lit son propre pool.

Un projet qu’un autre payeur finance partage la réserve de ce payeur avec les autres projets du payeur ; il lit sa propre part, et payer nomme le payeur. Le total de la réserve du payeur reste sur les lectures de facturation du payeur.

Authentification
projectBearer OU dashboardSession
Corps de la requête
aucun
ID d’opération
getBillingUsage

Paramètres

NomEnvoyerRequis ?Description
ScreenRig-Projecten-têteoptionnelObsolète pour une version. Doit être cohérent avec les droits JWT des projets ; ajoute les en-têtes Deprecation et Warning. Pas d’échange de jeton.
périoderequêteoptionnelMois UTC au format YYYY-MM ; par défaut, le mois en cours.
Modèle de requête et réponses
shell · modèle de requête
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/billing/usage'

Réponses

StatutSensCorps et en-têtes
200Utilisation du projet.ProjectBillingUsage (application/json) ; en-têtes : Cache-Control
400invalid_request - la période n’est pas un mois UTC au format YYYY-MM.Problème (application/problem+json)
par défaut

Réponse stable RFC 9457 à un problème. Un 421 server_draining porte un Retry-After de 1 seconde, un 500 not_ready ou dependency_unavailable porte 5, et un 500 manifest_degraded porte 60, sauf si le gestionnaire a défini une valeur plus spécifique.

Problème (application/problem+json)
GET/api/organizations/{organization_id}/app-store/offer

Obtenir l’offre App Store

Ce qu’une organisation peut acheter par l’App Store dans l’application screenRIG pour iPhone et iPad (bundle ai.screenrig.app), et le jeton de compte que portent ses achats.

Exige un administrateur désigné de l’organisation active (la personne qui gère son forfait et sa facturation) ; le personnel et les administrateurs du revendeur auquel l’organisation est déléguée peuvent lire l’offre sans products ni jeton, et toute autre personne reçoit un 404 not_found.

Une organisation déléguée à un revendeur ne liste aucun produit : son revendeur paie son forfait. account_token est un UUID aléatoire que le serveur crée une fois par organisation et conserve : l’application le transmet à StoreKit comme appAccountToken, de sorte que chaque transaction et chaque notification du serveur nomment leur organisation.

Pour un lecteur qui ne peut pas acheter, account_token est l’UUID composé uniquement de zéros. products liste les forfaits que l’appelant peut acheter maintenant, un produit App Store chacun : plus, education (seulement tant que education_eligible est true) et premium. education_eligible est true lorsque le personnel a vérifié une école ou un district scolaire K-12, ou lorsque l’administrateur qui lit l’offre a une adresse courriel de compte vérifiée sur un domaine scolaire K-12 (education_eligibility_source school_email) : ouvrir l’offre, ou enregistrer une transaction, en tant qu’administrateur de ce type rend l’organisation admissible une seule fois, écrit une entrée dans l’audit de l’organisation qui nomme le domaine correspondant, et inclut Education dans la même offre.

Une décision du personnel, dans un sens comme dans l’autre, est définitive et l’admissibilité automatique ne la remplace jamais.

Un forfait que l’organisation détient déjà par une autre source (personnel, facturation, autre abonnement), au même niveau ou à un niveau supérieur, n’est pas offert, sauf à la personne dont l’abonnement App Store le détient, qui peut changer de forfait au sein du groupe d’abonnements. can_purchase est true lorsque products n’est pas vide. subscription est l’abonnement App Store de l’organisation, ou null.

La réponse est privée et no-store.

Authentification
dashboardSession
Corps de la requête
aucun
ID d’opération
getAppStoreOffer

Paramètres

NomEnvoyerRequis ?Description
organization_idcheminobligatoire
Modèle de requête et réponses
shell · modèle de requête
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORGANIZATION_ID/app-store/offer'

Réponses

StatutSensCorps et en-têtes
200L’offre de forfaits App Store de l’organisation.AppStoreOffer (application/json); en-têtes : Cache-Control
par défaut

Réponse stable RFC 9457 à un problème. Un 421 server_draining porte un Retry-After de 1 seconde, un 500 not_ready ou dependency_unavailable porte 5, et un 500 manifest_degraded porte 60, sauf si le gestionnaire a défini une valeur plus spécifique.

Problème (application/problem+json)
POST/api/organizations/{organization_id}/app-store/transactions

Enregistrer une transaction App Store

Enregistre une transaction signée StoreKit 2 (Transaction.jwsRepresentation) achetée pour l’organisation et place l’organisation sur son forfait. Exige un administrateur désigné de l’organisation active, une authentification par cookie de même origine et, pour les sessions JWT, l’en-tête CSRF.

Le serveur vérifie le JWS avec sa chaîne x5c jusqu’à Apple Root CA - G3 (hors production, aussi la racine de test StoreKit de Xcode), l’ID de bundle ai.screenrig.app, l’ID de produit, l’environnement (Production en production seulement ; Sandbox partout, parce que App Review et TestFlight achètent avec des comptes sandbox en production ; Xcode hors production seulement) et que appAccountToken est égal à l’account_token de l’organisation (getAppStoreOffer) ; rien dans la requête ne nomme qui a payé.

Le forfait suit le produit de la plus récente transaction de l’abonnement : un forfait supérieur s’applique immédiatement et un forfait inférieur lorsque le prochain début de mois UTC de la facturation l’atteint, comme pour tout changement de forfait. Renvoyer une transaction, ou une plus ancienne, ne change rien et répond avec l’abonnement tel qu’il est ; une transaction expirée est enregistrée et ne change aucun forfait.

L’application finalise la transaction après un 2xx ou un problème 4xx définitif. Problèmes : app_store_transaction_invalid (422), app_store_account_mismatch (409), education_not_eligible (403), app_store_plan_conflict (409), billed_by_reseller (409, l’organisation est déléguée à un revendeur, qui paie son forfait).

Authentification
dashboardSession
Corps de la requête
AppStoreTransactionRequest
ID d’opération
recordAppStoreTransaction

Paramètres

NomEnvoyerRequis ?Description
organization_idcheminobligatoire

Champs du corps de la requête

ChampDescription
signed_transaction (obligatoire, chaîne)La jwsRepresentation StoreKit 2 de la transaction, exactement comme StoreKit l’a retournée. minLength: 1 maxLength: 65536
Modèle de requête et réponses
shell · modèle de requête
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/organizations/ORGANIZATION_ID/app-store/transactions'

Réponses

StatutSensCorps et en-têtes
200L’abonnement App Store après la transaction.AppStoreSubscription (application/json); en-têtes : Cache-Control
par défaut

Réponse stable RFC 9457 à un problème. Un 421 server_draining porte un Retry-After de 1 seconde, un 500 not_ready ou dependency_unavailable porte 5, et un 500 manifest_degraded porte 60, sauf si le gestionnaire a défini une valeur plus spécifique.

Problème (application/problem+json)
POST/api/app-store/notifications

Recevoir une notification App Store

Les App Store Server Notifications V2 d’Apple (le corps signedPayload), l’URL définie dans App Store Connect pour les environnements de production et de sandbox. Public : la charge utile signée tient lieu d’identifiant, vérifiée comme recordAppStoreTransaction vérifie une transaction, avec la transaction signée et les renseignements de renouvellement qu’elle contient.

SUBSCRIBED, DID_RENEW, DID_CHANGE_RENEWAL_PREF et DID_CHANGE_RENEWAL_STATUS (ainsi que OFFER_REDEEMED, RENEWAL_EXTENDED et REFUND_REVERSED) appliquent la plus récente transaction : un renouvellement prolonge l’abonnement, une mise à niveau change le forfait immédiatement et une rétrogradation lorsque le produit inférieur est renouvelé à la fin de la période.

EXPIRED, GRACE_PERIOD_EXPIRED, REFUND et REVOKE mettent fin à l’abonnement et retirent le forfait qu’il a défini, comme la facturation retire tout forfait : au prochain début de mois UTC, sans reprendre ce qui a déjà été accordé. Un forfait que le personnel ou la facturation ont appliqué à l’organisation depuis n’est jamais retiré.

Tout autre type, une notification pour un produit qui n’est pas un forfait et une notification qui ne nomme aucune organisation sont acquittés et consignés. 200 accuse réception. Une charge utile qui ne se vérifie pas est un problème 422 app_store_transaction_invalid ; une défaillance côté serveur est un 5xx, qu’Apple renvoie. Limité par adresse client.

Authentification
aucun
Corps de la requête
AppStoreNotificationRequest
ID d’opération
receiveAppStoreNotification

Champs du corps de la requête

ChampDescription
signedPayload (obligatoire, chaîne)Notification signée d’Apple (un JWS). minLength: 1
Modèle de requête et réponses
shell · modèle de requête
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://api.screenrig.ai/api/app-store/notifications'

Réponses

StatutSensCorps et en-têtes
200La notification a été acquittée.AppStoreNotificationAcknowledgement (application/json); en-têtes : Cache-Control
422app_store_transaction_invalid — la charge utile n’est pas une notification App Store valide pour ce serveur.Problème (application/problem+json)
429

Problème stable rate_limited. Réessayez seulement après l’intervalle Retry-After autoritaire. Les refus à fenêtre fixe incluent aussi la politique RateLimit-Policy applicable et les membres RateLimit ; les refus de concurrence et de budget d’octets omettent ces divulgations optionnelles.

Problème (application/problem+json) ; en-têtes : Retry-After, RateLimit-Policy, RateLimit
par défaut

Réponse stable RFC 9457 à un problème. Un 421 server_draining porte un Retry-After de 1 seconde, un 500 not_ready ou dependency_unavailable porte 5, et un 500 manifest_degraded porte 60, sauf si le gestionnaire a défini une valeur plus spécifique.

Problème (application/problem+json)