{"openapi":"3.1.0","info":{"title":"Notifly free tools API","version":"1.0.0","description":"Free, no-key endpoints behind the developer tools at https://notifly.io/tools. No account, CORS open to every origin, 30 requests a minute and 300 a day per address. Every response carries an X-Tool-Docs header naming the tool page."},"servers":[{"url":"https://notifly.io"}],"tags":[{"name":"Free tools","description":"No-key developer tools."}],"paths":{"/api/tools/validate-apns":{"post":{"summary":"Validate an APNs payload and headers","description":"Checks an Apple Push Notification service request against Apple's documented aps keys and types, push types, topic suffixes, header formats and the 4 KB (5 KB for VoIP) payload limit.","tags":["Free tools"],"security":[],"externalDocs":{"url":"https://notifly.io/tools/apns-payload-builder"},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["payload"],"properties":{"payload":{"type":"object","description":"The JSON body you send to APNs, with its aps dictionary."},"headers":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional request headers: apns-push-type, apns-priority, apns-topic, apns-id, apns-expiration, apns-collapse-id."}}}}}},"responses":{"200":{"description":"The validation report. Send `Accept: text/markdown` for a Markdown rendering.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationReport"}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"Missing or unparsable JSON.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}},"413":{"description":"Body over 32 KB.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}},"429":{"description":"Over 30 requests a minute or 300 a day from one address. See Retry-After.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}}}},"get":{"summary":"Validate an APNs payload and headers (GET)","description":"The same check, with the request JSON URL-encoded in the `request` query parameter.","tags":["Free tools"],"security":[],"externalDocs":{"url":"https://notifly.io/tools/apns-payload-builder"},"parameters":[{"name":"request","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The validation report. Send `Accept: text/markdown` for a Markdown rendering.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationReport"}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"Missing or unparsable JSON.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}},"413":{"description":"Body over 32 KB.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}},"429":{"description":"Over 30 requests a minute or 300 a day from one address. See Retry-After.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}}}}},"/api/tools/validate-fcm":{"post":{"summary":"Validate an FCM HTTP v1 message","description":"Checks a Firebase Cloud Messaging send body against the HTTP v1 REST reference: one target, known field names, string data values, reserved keys, Android/APNs/web overrides, and the 4096-byte (2048 for topics) payload limit.","tags":["Free tools"],"security":[],"externalDocs":{"url":"https://notifly.io/tools/fcm-payload-builder"},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"object","description":"The FCM message, as sent to messages:send."}}}}}},"responses":{"200":{"description":"The validation report. Send `Accept: text/markdown` for a Markdown rendering.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationReport"}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"Missing or unparsable JSON.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}},"413":{"description":"Body over 32 KB.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}},"429":{"description":"Over 30 requests a minute or 300 a day from one address. See Retry-After.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}}}},"get":{"summary":"Validate an FCM HTTP v1 message (GET)","description":"The same check, with the request JSON URL-encoded in the `request` query parameter.","tags":["Free tools"],"security":[],"externalDocs":{"url":"https://notifly.io/tools/fcm-payload-builder"},"parameters":[{"name":"request","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The validation report. Send `Accept: text/markdown` for a Markdown rendering.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationReport"}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"Missing or unparsable JSON.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}},"413":{"description":"Body over 32 KB.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}},"429":{"description":"Over 30 requests a minute or 300 a day from one address. See Retry-After.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}}}}}},"components":{"schemas":{"Finding":{"type":"object","required":["path","message"],"properties":{"path":{"type":"string","description":"JSON path of the value, e.g. aps.alert.title or headers.apns-priority."},"message":{"type":"string"}}},"ValidationReport":{"type":"object","required":["valid","errors","warnings","sizeBytes","limitBytes"],"properties":{"valid":{"type":"boolean","description":"True when there are no errors; warnings never invalidate a payload."},"errors":{"type":"array","items":{"$ref":"#/components/schemas/Finding"}},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/Finding"}},"sizeBytes":{"type":"integer","description":"UTF-8 size of what the platform limit counts."},"limitBytes":{"type":"integer","description":"The platform limit that applies to this request."}}},"Problem":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}}