OpenAPI YAMLOpenAPI JSONproblemas YAMLVisão geral da API
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
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.
Parâmetros
| Nome | Enviar | Obrigatório? | Descrição |
|---|---|---|---|
| ScreenRig-Project | cabeçalho | opcional | Obsoleto 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
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/billing/balance'Respostas
| Status | Significado | Corpo e cabeçalhos |
|---|---|---|
| 200 | Instantâ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) |
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.
Parâmetros
| Nome | Enviar | Obrigatório? | Descrição |
|---|---|---|---|
| ScreenRig-Project | cabeçalho | opcional | Obsoleto por uma versão. Deve ser consistente com as concessões de projetos JWT; adiciona cabeçalhos Deprecation e Warning. Sem troca de token. |
| cursor | consulta | opcional | |
| limite | consulta | opcional |
Modelo e respostas da solicitação
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/billing/statement'Respostas
| Status | Significado | Corpo e cabeçalhos |
|---|---|---|
| 200 | Página de extrato. | Extrato de cobrança (application/json) |
| 400 | invalid_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) |
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.
Parâmetros
| Nome | Enviar | Obrigatório? | Descrição |
|---|---|---|---|
| ScreenRig-Project | cabeçalho | opcional | Obsoleto 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íodo | consulta | opcional | Mês UTC no formato YYYY-MM; padrão para o mês atual. |
Modelo e respostas da solicitação
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/billing/usage'Respostas
| Status | Significado | Corpo e cabeçalhos |
|---|---|---|
| 200 | Uso do projeto. | ProjectBillingUsage (application/json); cabeçalhos: Cache-Control |
| 400 | invalid_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) |
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.
Parâmetros
| Nome | Enviar | Obrigatório? | Descrição |
|---|---|---|---|
| organization_id | caminho | obrigatório |
Modelo e respostas da solicitação
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORGANIZATION_ID/app-store/offer'Respostas
| Status | Significado | Corpo e cabeçalhos |
|---|---|---|
| 200 | A 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) |
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).
Parâmetros
| Nome | Enviar | Obrigatório? | Descrição |
|---|---|---|---|
| organization_id | caminho | obrigatório |
Campos do corpo da solicitação
| Campo | Descriçã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
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
| Status | Significado | Corpo e cabeçalhos |
|---|---|---|
| 200 | A 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) |
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.
Campos do corpo da solicitação
| Campo | Descrição |
|---|---|
| signedPayload (obrigatório, string) | Notificação assinada da Apple (um JWS). minLength: 1 |
Modelo e respostas da solicitação
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://api.screenrig.ai/api/app-store/notifications'Respostas
| Status | Significado | Corpo e cabeçalhos |
|---|---|---|
| 200 | A notificação foi confirmada. | AppStoreNotificationAcknowledgement (application/json); cabeçalhos: Cache-Control |
| 422 | app_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) |