SignOps Push API
The Push API from SignOps — 3 operation(s) for push.
The Push API from SignOps — 3 operation(s) for push.
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/signops:signops-push-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
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:
title: SignOps Push API
version: 1.0.0
description: 'Push notifications to Android, iOS and the web, login approval on a trusted phone, passkeys, authenticator codes and email OTP, on one API key and your own user ids. Errors are { error: { code, message } }. Test keys (sk_test_) send only to test devices and addresses and are not billed.'
contact:
email: hello@signops.dev
url: https://signops.dev/docs/
termsOfService: https://signops.dev/terms/
servers:
- url: https://api.signops.dev
security:
- secretKey: []
tags:
- name: Push
paths:
/v1/push:
post:
operationId: postPush
summary: Send a push
description: Send to exactly one of user_id, user_ids, topic or all. A push to one user_id, now, is sent before the API answers, with the real result; anything else answers sending or scheduled and reports through webhooks.
tags:
- Push
security:
- secretKey: []
parameters:
- name: Idempotency-Key
in: header
required: false
description: The same key within 24 hours returns the first result instead of acting twice.
schema:
type: string
maxLength: 128
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PushRequest'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/PushResult'
4XX:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
5XX:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
get:
operationId: getPush
summary: List pushes
description: Newest first. On Free only scheduled and sending pushes are listed.
tags:
- Push
security:
- secretKey: []
parameters:
- name: limit
in: query
required: false
schema:
type: integer
description: 1 to 100, default 20.
minimum: 1
maximum: 100
- name: before
in: query
required: false
schema:
type: string
description: The next value from the previous page.
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/PushSummary'
description: Pushes.
next:
type: string
description: Pass as before for the next page, or null.
4XX:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
5XX:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/v1/push/{id}:
get:
operationId: getPushById
summary: Get a push
tags:
- Push
security:
- secretKey: []
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/PushDetail'
4XX:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
5XX:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
delete:
operationId: deletePushById
summary: Cancel a scheduled push
tags:
- Push
security:
- secretKey: []
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
id:
type: string
description: Push id.
status:
type: string
description: cancelled
4XX:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
5XX:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/v1/push/{id}/opened:
post:
operationId: postPushByIdOpened
summary: Report an open
description: Called by the SDKs when the user opens the push or taps a button. Every push carries its id as data.signops_id.
tags:
- Push
security:
- publishableKey: []
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
action:
type: string
description: The id of the tapped button, if any.
platform:
type: string
description: android, ios or web.
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
id:
type: string
description: Push id.
opened:
type: integer
description: Opens so far, or null.
4XX:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
5XX:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
components:
schemas:
Error:
type: object
properties:
error:
type: object
properties:
code:
type: string
description: Machine-readable code, like invalid_request, rate_limited or expired.
message:
type: string
description: Written for a developer to read.
required:
- code
- message
required:
- error
PushRequest:
type: object
properties:
user_id:
type: string
description: Your own id for the user, up to 128 characters without spaces.
maxLength: 128
user_ids:
type: array
items:
type: string
description: Your own id for the user, up to 128 characters without spaces.
maxLength: 128
description: Up to 1,000 users.
maxItems: 1000
topic:
type: string
description: A topic name.
all:
type: boolean
description: Every device in the app.
title:
type: string
description: Notification title.
body:
type: string
description: The text under it.
image:
type: string
description: https image URL.
link:
type: string
description: Deep link or URL opened on tap.
data:
type: object
additionalProperties:
type: string
description: Key and value pairs your app reads. With no title or body, the push is silent.
buttons:
type: array
items:
type: object
properties:
id:
type: string
description: Up to 32 letters, digits, dashes, dots or underscores; reported as the open's action.
title:
type: string
description: Up to 40 characters.
link:
type: string
description: Opened on tap.
required:
- id
- title
description: 1 to 3 buttons.
minItems: 1
maxItems: 3
sound:
description: A sound file in the app, "default", or false for none.
oneOf:
- type: string
- type: boolean
const: false
badge:
type: integer
description: App icon number, 0 to 99,999. 0 clears it on iOS.
minimum: 0
maximum: 99999
android_channel:
type: string
description: Android notification channel id.
ios_category:
type: string
description: iOS notification category the app registered.
thread_id:
type: string
description: iOS notification group.
priority:
type: string
description: Default high.
enum:
- high
- normal
ttl:
type: integer
description: Seconds a push may wait for an offline device, up to 28 days.
minimum: 0
maximum: 2419200
collapse_key:
type: string
description: Newer pushes with the same key replace older ones, up to 64 characters.
send_at:
type: string
description: ISO time with a zone, up to 30 days ahead.
format: date-time
marketing:
type: boolean
description: Applies the app's daily cap per user and, when turned on, the consent check.
template:
type: string
description: A template's name.
fields:
type: object
additionalProperties:
type: string
description: Values for the template.
fields_by_user:
type: object
additionalProperties:
type: object
description: 'With user_ids: each user''s own values, on top of fields.'
inbox:
type: boolean
description: Also keep it in each user's inbox (Starter and Pro).
PushDetail:
type: object
properties:
id:
type: string
description: Push id.
status:
type: string
description: Status.
devices:
type: integer
description: Devices.
sent:
type: integer
description: Sent.
failed:
type: integer
description: Failed.
opened:
type: integer
description: Opens reported by the SDKs.
send_at:
type: string
description: ISO 8601 time.
format: date-time
created_at:
type: string
description: ISO 8601 time.
format: date-time
by_platform:
type: object
properties:
android:
type: object
properties:
sent:
type: integer
description: Sent.
failed:
type: integer
description: Failed.
ios:
type: object
properties:
sent:
type: integer
description: Sent.
failed:
type: integer
description: Failed.
web:
type: object
properties:
sent:
type: integer
description: Sent.
failed:
type: integer
description: Failed.
PushSummary:
type: object
properties:
id:
type: string
description: Push id.
status:
type: string
description: Status.
template:
type: string
description: Template, if any.
devices:
type: integer
description: Devices.
sent:
type: integer
description: Sent.
failed:
type: integer
description: Failed.
send_at:
type: string
description: ISO 8601 time.
format: date-time
created_at:
type: string
description: ISO 8601 time.
format: date-time
PushResult:
type: object
properties:
id:
type: string
description: Push id.
status:
type: string
description: sent, sending or scheduled.
devices:
type: integer
description: Devices targeted.
sent:
type: integer
description: 'For one user, now: devices that took it.'
failed:
type: integer
description: 'For one user, now: devices that refused it.'
inbox:
type: object
properties: {}
description: Inbox rows stored, when inbox is true.
securitySchemes:
secretKey:
type: http
scheme: bearer
description: sk_live_... or sk_test_..., on your server only.
publishableKey:
type: http
scheme: bearer
description: pk_live_... or pk_test_..., used by the SDKs in apps and browsers.
externalDocs:
description: Docs
url: https://signops.dev/docs/