Referência da API

API de Faturamento

Planos, saldos e extratos de créditos

Referência HTTP. Gerada a partir do contrato backend. Navegue pelos endpoints abaixo ou baixe o OpenAPI.

Este grupo tem 6 operações, geradas a partir de api/openapi.yaml. Filtre por caminho, ação ou autenticação. Cada endpoint lista suas entradas; expanda-o para ver um modelo de solicitação e os códigos de resposta. Os modelos precisam de seus próprios valores e de um corpo válido conforme o esquema.

Substitua os espaços reservados em maiúsculas pelos seus valores. Para uma solicitação JSON, salve um corpo que corresponda ao esquema em request.json. Exemplos de cookies usam um jar local de cookies de uma sessão autenticada.

Planos, saldos e extratos de créditos

GET/api/billing/balance

Obter saldo de cobrança

O snapshot do saldo consciente da fonte do projeto chamador. Todos os valores em milicréditos são strings decimais canônicas. É um snapshot, não autoridade para pagar; rails_available é falso enquanto cartão, imposto e rail de saque estão indisponíveis.

Autenticação
projectBearer OU dashboardSession
Corpo da solicitação
nenhum
ID da operação
getBillingBalance

Parâmetros

NomeEnviarObrigatório?Descrição
ScreenRig-ProjectcabeçalhoopcionalObsoleto por uma versão. Deve ser consistente com as concessões de projetos JWT; adiciona cabeçalhos Deprecation e Warning. Sem troca de token.
Modelo e respostas da solicitação
shell · modelo de requisição
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/billing/balance'

Respostas

StatusSignificadoCorpo e cabeçalhos
200Instantâneo do saldo.Saldo de cobrança (application/json)
padrão

Resposta de problema estável RFC 9457. Um 421 server_draining tem Retry-After de 1 segundo, um 500 not_ready ou dependency_unavailable tem 5, e um 500 manifest_degraded tem 60, a menos que o handler defina valor mais específico.

Problema (application/problem+json)
GET/api/billing/statement

Obter extrato de cobrança

Paginação cursor estável sobre entradas de diário imutáveis postadas para o projeto chamador. Holds não são entradas postadas. Correções linkam ao evento original em vez de reescrevê-lo. Não há mutação arbitrária de concessão ou pagamento nesta superfície.

Autenticação
projectBearer OU dashboardSession
Corpo da solicitação
nenhum
ID da operação
getBillingStatement

Parâmetros

NomeEnviarObrigatório?Descrição
ScreenRig-ProjectcabeçalhoopcionalObsoleto por uma versão. Deve ser consistente com as concessões de projetos JWT; adiciona cabeçalhos Deprecation e Warning. Sem troca de token.
cursorconsultaopcional
limiteconsultaopcional
Modelo e respostas da solicitação
shell · modelo de requisição
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/billing/statement'

Respostas

StatusSignificadoCorpo e cabeçalhos
200Página de extrato.Extrato de cobrança (application/json)
400invalid_request - limite fora do intervalo.Problema (application/problem+json)
padrão

Resposta de problema estável RFC 9457. Um 421 server_draining tem Retry-After de 1 segundo, um 500 not_ready ou dependency_unavailable tem 5, e um 500 manifest_degraded tem 60, a menos que o handler defina valor mais específico.

Problema (application/problem+json)
GET/api/billing/usage

Obter uso de cobrança

O uso do projeto chamador em um mês UTC, com os bytes servidos e recebidos (nunca cobrados), o armazenamento cobrado acima do armazenamento gratuito do plano do pagador (allowance.storage_bytes) e as solicitações de API, eventos de stream do projeto faturados e tentativas de entrega de webhook contados contra os 10.000 gratuitos por mês. Um projeto que paga por si mesmo lê seu próprio pool.

Um projeto que outro pagador paga compartilha o pool desse pagador com os outros projetos do pagador; ele lê sua própria parte, e payer nomeia o pagador. O total do pool do pagador permanece nas leituras de cobrança do pagador.

Autenticação
projectBearer OU dashboardSession
Corpo da solicitação
nenhum
ID da operação
getBillingUsage

Parâmetros

NomeEnviarObrigatório?Descrição
ScreenRig-ProjectcabeçalhoopcionalObsoleto por uma versão. Deve ser consistente com as concessões de projetos JWT; adiciona cabeçalhos Deprecation e Warning. Sem troca de token.
períodoconsultaopcionalMês UTC no formato YYYY-MM; padrão para o mês atual.
Modelo e respostas da solicitação
shell · modelo de requisição
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/billing/usage'

Respostas

StatusSignificadoCorpo e cabeçalhos
200Uso do projeto.ProjectBillingUsage (application/json); cabeçalhos: Cache-Control
400invalid_request - período não é um mês UTC no formato YYYY-MM.Problema (application/problem+json)
padrão

Resposta de problema estável RFC 9457. Um 421 server_draining tem Retry-After de 1 segundo, um 500 not_ready ou dependency_unavailable tem 5, e um 500 manifest_degraded tem 60, a menos que o handler defina valor mais específico.

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

Obter oferta da App Store

O que uma organização pode comprar pela App Store no app do screenRIG para iPhone e iPad (bundle ai.screenrig.app) e o token de conta que suas compras carregam.

Exige um administrador designado da organização ativa (a pessoa que gerencia seu plano e sua cobrança); a equipe e os admins do revendedor ao qual a organização está delegada podem ler a oferta sem products ou token, e qualquer outra pessoa recebe 404 not_found.

Uma organização delegada a um revendedor não lista produtos: o revendedor dela paga pelo plano. account_token é um UUID aleatório que o servidor cria uma vez por organização e guarda: o app o passa ao StoreKit como appAccountToken, de modo que cada transação e cada notificação do servidor nomeia sua organização.

Para um leitor que não pode comprar, account_token é o UUID só de zeros. products lista os planos que quem chama pode comprar agora, um produto da App Store cada: plus, education (somente enquanto education_eligible for true) e premium. education_eligible é true quando a equipe verificou uma escola ou um distrito K-12, ou quando o administrador que lê a oferta tem um endereço de e-mail de conta verificado em um domínio escolar K-12 (education_eligibility_source school_email): abrir a oferta, ou registrar uma transação, como esse administrador torna a organização elegível uma vez, grava uma entrada de auditoria da organização com o domínio correspondente e inclui o Education na mesma oferta.

Uma decisão da equipe, em qualquer sentido, é definitiva e a elegibilidade automática nunca a substitui.

Um plano que a organização já tem por outra origem (equipe, faturamento, outra assinatura) no mesmo nível ou em um nível superior não é oferecido, exceto à pessoa cuja assinatura da App Store o mantém, que pode trocar de plano dentro do grupo de assinaturas. can_purchase é true quando products não está vazio. subscription é a assinatura da App Store da organização, ou null.

A resposta é privada e no-store.

Autenticação
dashboardSession
Corpo da solicitação
nenhum
ID da operação
getAppStoreOffer

Parâmetros

NomeEnviarObrigatório?Descrição
organization_idcaminhoobrigatório
Modelo e respostas da solicitação
shell · modelo de requisição
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORGANIZATION_ID/app-store/offer'

Respostas

StatusSignificadoCorpo e cabeçalhos
200A oferta de planos da App Store da organização.AppStoreOffer (application/json); cabeçalhos: Cache-Control
padrão

Resposta de problema estável RFC 9457. Um 421 server_draining tem Retry-After de 1 segundo, um 500 not_ready ou dependency_unavailable tem 5, e um 500 manifest_degraded tem 60, a menos que o handler defina valor mais específico.

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

Registrar transação da App Store

Registra uma transação assinada do StoreKit 2 (Transaction.jwsRepresentation) comprada para a organização e coloca a organização no seu plano. Exige um administrador designado da organização ativa, autenticação por cookie da mesma origem e, para sessões JWT, o cabeçalho CSRF.

O servidor verifica o JWS com sua cadeia x5c até a Apple Root CA - G3 (fora da produção também a raiz de teste do StoreKit do Xcode), o bundle id ai.screenrig.app, o id do produto, o ambiente (Production somente na produção; Sandbox em todo lugar, porque App Review e TestFlight compram com contas sandbox contra a produção; Xcode somente fora da produção) e que appAccountToken seja igual ao account_token da organização (getAppStoreOffer); nada na requisição nomeia quem pagou.

O plano segue o produto da transação mais recente da assinatura: um plano superior vale de imediato e um inferior quando o próximo limite mensal UTC da cobrança o alcança, como em qualquer mudança de plano. Enviar uma transação de novo, ou uma mais antiga, não muda nada e responde com a assinatura como está; uma transação expirada é registrada e não muda nenhum plano.

O app conclui a transação após um 2xx ou um problema 4xx definitivo. Problemas: app_store_transaction_invalid (422), app_store_account_mismatch (409), education_not_eligible (403), app_store_plan_conflict (409), billed_by_reseller (409, a organização é delegada a um revendedor, que paga pelo plano dela).

Autenticação
dashboardSession
Corpo da solicitação
AppStoreTransactionRequest
ID da operação
recordAppStoreTransaction

Parâmetros

NomeEnviarObrigatório?Descrição
organization_idcaminhoobrigatório

Campos do corpo da solicitação

CampoDescrição
signed_transaction (obrigatório, string)A jwsRepresentation do StoreKit 2 da transação, exatamente como o StoreKit a retornou. minLength: 1 maxLength: 65536
Modelo e respostas da solicitação
shell · modelo de requisição
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'

Respostas

StatusSignificadoCorpo e cabeçalhos
200A assinatura da App Store após a transação.AppStoreSubscription (application/json); cabeçalhos: Cache-Control
padrão

Resposta de problema estável RFC 9457. Um 421 server_draining tem Retry-After de 1 segundo, um 500 not_ready ou dependency_unavailable tem 5, e um 500 manifest_degraded tem 60, a menos que o handler defina valor mais específico.

Problema (application/problem+json)
POST/api/app-store/notifications

Receber notificação da App Store

App Store Server Notifications V2 da Apple (o corpo signedPayload), a URL definida no App Store Connect para os ambientes de produção e sandbox. Público: o payload assinado é a credencial, verificado do mesmo modo que recordAppStoreTransaction verifica uma transação, junto com a transação assinada e as informações de renovação dentro dele.

SUBSCRIBED, DID_RENEW, DID_CHANGE_RENEWAL_PREF e DID_CHANGE_RENEWAL_STATUS (e OFFER_REDEEMED, RENEWAL_EXTENDED e REFUND_REVERSED) aplicam a transação mais recente: uma renovação estende a assinatura, um upgrade muda o plano de imediato e um downgrade quando o produto inferior é renovado no fim do período.

EXPIRED, GRACE_PERIOD_EXPIRED, REFUND e REVOKE encerram a assinatura e removem o plano que ela definiu, como a cobrança remove qualquer plano: no próximo limite mensal UTC, sem retirar nada já concedido. Um plano que a equipe ou o faturamento colocaram na organização depois nunca é removido.

Qualquer outro tipo, uma notificação de um produto que não é um plano e uma que não nomeia nenhuma organização são confirmadas e registradas. 200 confirma. Um payload que não é verificado é um problema 422 app_store_transaction_invalid; uma falha do lado do servidor é um 5xx, que a Apple reenvia. Limitado por endereço do cliente.

Autenticação
nenhum
Corpo da solicitação
AppStoreNotificationRequest
ID da operação
receiveAppStoreNotification

Campos do corpo da solicitação

CampoDescrição
signedPayload (obrigatório, string)Notificação assinada da Apple (um JWS). minLength: 1
Modelo e respostas da solicitação
shell · modelo de requisição
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://api.screenrig.ai/api/app-store/notifications'

Respostas

StatusSignificadoCorpo e cabeçalhos
200A notificação foi confirmada.AppStoreNotificationAcknowledgement (application/json); cabeçalhos: Cache-Control
422app_store_transaction_invalid — o payload não é uma notificação válida da App Store para este servidor.Problema (application/problem+json)
429

Problema estável rate_limited. Refaça só após o intervalo Retry-After autoritativo. Negativas de janela fixa incluem também RateLimit-Policy e membros RateLimit aplicáveis; negativas de concorrência e orçamento de bytes omitem essas divulgações opcionais.

Problema (application/problem+json); cabeçalhos: Retry-After, RateLimit-Policy, RateLimit
padrão

Resposta de problema estável RFC 9457. Um 421 server_draining tem Retry-After de 1 segundo, um 500 not_ready ou dependency_unavailable tem 5, e um 500 manifest_degraded tem 60, a menos que o handler defina valor mais específico.

Problema (application/problem+json)