Projects isolate API keys, credentials, contacts, templates, logs, and webhooks.
Upload FCM/APNs/Web Push credentials for push. Add and verify email domains, or use the shared KimePush domain for testing.
Send contact names and topics from your app or backend. KimePush stores topics for later broadcasts.
Use transactional APIs or broadcasts. Delivery events flow into logs and optional webhooks.
API requests use Authorization: Bearer <key>.
pk_live_...pk_pub_...pk_test_...Android uses FCM service account JSON. iOS uses APNs team id, key id, bundle id, environment, and .p8 key. Web Push uses VAPID keys generated by KimePush.
Contacts are project-scoped profiles with email, external id, name fields, topics, and subscription status. A topic is an audience or subscription such as weekly_digest, product_updates, or launch. Broadcasts match contacts that have every selected topic.
{
"email": "asha@example.com",
"external_id": "user_123",
"first_name": "Asha",
"last_name": "Kumar",
"topics": ["weekly_digest", "launch"]
}
// Broadcast matching uses AND semantics:
// contact must have weekly_digest AND launch./v1/tokens/registerPublishable or secret keyRegister a mobile or web push token. Optional contact fields attach the token to a contact for topic broadcasts.
{
"user_id": "user_123",
"platform": "fcm",
"token": "device_token...",
"environment": "production",
"email": "asha@example.com",
"first_name": "Asha",
"topics": ["product_updates"],
"metadata": {
"app_version": "2.1.0"
}
}/v1/contactsSecret keyCreate or update a project contact with names and topics.
{
"email": "asha@example.com",
"external_id": "user_123",
"first_name": "Asha",
"last_name": "Kumar",
"topics": ["weekly_digest", "product_updates"]
}/v1/contacts/:id/topicsSecret keyReplace the topics assigned to a contact from your backend.
{
"topics": ["launch", "weekly_digest"]
}/v1/notifySecret or test keySend one push notification to all active devices for one user.
{
"to": "user_123",
"title": "Your order shipped",
"body": "Arrives Thursday",
"deep_link": "myapp://orders/ORD-9981",
"data": { "order_id": "ORD-9981" },
"priority": "high",
"idempotency_key": "order-shipped-ORD-9981"
}/v1/broadcastSecret or test keyBroadcast mobile push or web push to tokens matching selected topics. Multiple topics use AND semantics.
{
"channel": "mobile_push",
"title": "New update available",
"body": "Version 2.1 is ready to install",
"topics": ["product_updates"]
}/v1/notifications/:idSecret keyRead push notification delivery status and per-token delivery details.
Add HTTPS endpoints in Project Settings. KimePush signs each payload with the webhook secret shown once at creation time.
push.deliveredpush.failedpush.token_deactivatedweb_push.deliveredweb_push.failedweb_push.token_deactivatedcontact.createdcontact.updatedcontact.unsubscribedconst signature = req.headers['x-kimepush-signature'];
const timestamp = req.headers['x-kimepush-timestamp'];
const expected = 'sha256=' +
crypto.createHmac('sha256', webhookSecret)
.update(timestamp + '.' + rawBody)
.digest('hex');
if (!crypto.timingSafeEqual(
Buffer.from(signature), Buffer.from(expected)
)) throw new Error('Invalid signature');GET /status is backed by the KimePush status incident tables, not hardcoded page text. Admin can create and update incidents from the admin console. The endpoint returns overall state and active incidents for the public status page.
curl https://api.kimepush.kimevik.com/status
{
"status": "operational",
"incidents": []
}Every error response has the shape { "error": "<code>", "message": "<detail>" }. error is the stable code to branch on; message is a human-readable detail that can vary per request.
unauthorized | 401 | The request is missing a valid API key or session credential. |
forbidden | 403 | The credential used cannot perform this action (e.g. a publishable key on a secret-key-only route). |
no_customer | 400 | No Stripe customer exists yet for this account. |
no_stripe_price | 400 | No Stripe price is configured for the requested plan. |
stripe_publishable_key_missing | 400 | Stripe is not fully configured for this environment. |
account_suspended | 403 | This account is suspended and cannot send notifications or emails. |
product_not_enabled | 403 | The product (e.g. email_push) is not enabled for this account. |
stripe_error | 502 | Stripe returned an error while processing this request. |
delete_confirmation_required | 400 | Destructive action requires an explicit confirmation field. |
invalid_ses_event | 400 | The inbound SES event payload could not be parsed. |
invalid_sns_payload | 400 | The inbound SNS payload could not be parsed. |
invalid_subscribe_url | 400 | The SNS SubscribeURL host is not an expected AWS SNS endpoint. |
no_contacts | 400 | No contacts matched the requested topics/tags for this broadcast. |
too_many_contacts | 400 | The matched contact count exceeds the broadcast limit (5000). |
unsupported_sns_signature_version | 400 | The SNS message used a signature version KimePush does not verify. |
invalid_sns_signature | 401 | The SNS message signature failed verification. |
sns_topic_mismatch | 403 | The SNS message's topic ARN does not match the configured SES topic. |
domain_taken | 409 | This sending domain is already claimed by another project. |
domain_limit_reached | 429 | This account has reached its sending-domain limit. |
ses_error | 502 | AWS SES returned an error while sending this email. |
sns_subscription_failed | 502 | KimePush could not confirm the SNS subscription. |
bad_request | 400 | The request body failed validation. See the message field for which field. |
not_found | 404 | The requested resource does not exist, or does not belong to this project. |
payload_too_large | 413 | The request body exceeds the size limit for this endpoint. |
rate_limited | 429 | Too many requests from this API key in the current window. |
internal_error | 500 | An unexpected server error. Retry with backoff; contact support if it persists. |
invalid_apns_token | 400 | The token does not look like a 64-character hex APNs device token. |
no_tokens | 400 | No active device tokens matched the requested platform/topics/tags. |
not_configured | 400 | The requested platform (fcm/apns/web) has no credentials configured for this project, or the token's environment doesn't match. |
too_many_tokens | 400 | The matched token count exceeds the broadcast limit. |
quota_exceeded | 429 | This account has reached its monthly notification/email quota. |
email_mismatch | 403 | The invite token does not match the signed-in account's email. |
already_invited | 409 | This email already has a pending or accepted team invite. |
End users generally do not need to know about the internal SNS dead-letter queue. It is an operator control for KimePush reliability.
A DLQ stores event messages that SNS could not deliver to KimePush after retries. KimePush should monitor this in Admin because DLQ messages mean delivery telemetry may be delayed or missing.
User-facing error handling is shown through logs, webhook delivery status, permanent token failures, bounces, complaints, and status incidents.