{"data":{"name":"Tapter Profile API","version":"v1","baseUrl":"https://tapter.one/api/v1","authentication":{"scheme":"Bearer","header":"Authorization: Bearer <token>","tokenPrefix":"tptr_","issuedAt":"https://tapter.one/settings/api","abilities":{"profile:read":"Read profiles, slots, their statistics and discovery.","profile:write":"Create, change and delete slots, update profiles, upload files."}},"discovery":{"me":"https://tapter.one/api/v1/me","slotTypes":"https://tapter.one/api/v1/slot-types","profileSettings":"https://tapter.one/api/v1/profiles/{profile}/settings","openapi":"https://tapter.one/api/v1/openapi.json","profileMarkdown":"https://tapter.one/api/v1/profiles/{profile}/markdown","musicLookup":"https://tapter.one/api/v1/music/lookup?query=<UPC|ISRC|release link|title>","notificationChannels":"https://tapter.one/api/v1/notification-channels","stickers":"https://tapter.one/api/v1/stickers","analytics":"https://tapter.one/api/v1/analytics","profileAnalytics":"https://tapter.one/api/v1/profiles/{profile}/analytics","slotAnalytics":"https://tapter.one/api/v1/profiles/{profile}/analytics/slots/{slotId}","socialAnalytics":"https://tapter.one/api/v1/profiles/{profile}/analytics/socials?link=<social link>","socialAccounts":"https://tapter.one/api/v1/social/accounts","socialSummary":"https://tapter.one/api/v1/social/analytics","socialAccountAnalytics":"https://tapter.one/api/v1/social/accounts/{account}/analytics","socialPosts":"https://tapter.one/api/v1/social/accounts/{account}/posts","socialPost":"https://tapter.one/api/v1/social/accounts/{account}/posts/{post}","socialCompare":"https://tapter.one/api/v1/social/compare?type=accounts|posts|periods"},"conventions":{"envelope":"Success: {data, meta?}. Error: {message, code, errors?, documentation?}.","keys":"camelCase","dates":"ISO 8601","strictWrite":"Unknown or server-computed fields in data return 422 listing every offending key.","tolerantRead":"Legacy slots are returned with \"supported\": false and can be deleted or reordered, but not edited.","dryRun":"Send \"Precognition: true\" on any write request to validate without executing.","login":"A profile login is its public URL. It can be changed through PATCH /profiles/{profile}/settings, but the old address stops working immediately and is not redirected, so existing links, QR codes and NFC tags break. Change it only when the user explicitly asked to, and check availability with GET /profiles/check-login first.","batch":"Blocks go in batches. Creating a page? Send every block in one POST /profiles/{profile}/slots/batch — the array order is the page order. Changing several blocks is one PATCH /profiles/{profile}/slots, removing several is one DELETE /profiles/{profile}/slots with {\"ids\": [...]}; each is all or nothing. Reordering stays PUT /profiles/{profile}/slots/order. Calling the per-slot endpoints in a loop works but burns the rate limit.","editing":"Change a block with PATCH, do not delete and re-create it: click statistics are tied to the slot id and disappear with it.","idempotency":"Send \"Idempotency-Key: <string>\" on any write request (POST, PATCH, PUT, DELETE). Repeating it within 24h returns the stored response.","images":"Profile avatar is rendered as a circle: send a square (1:1, 800x800+). Profile bgImage is optional — do not generate one unless the user asked — and is rendered full width without cropping: send 16:9 landscape (1600x900+), otherwise it pushes the whole page below the fold. Uploads are downscaled to 800px width, so larger than ~1600px brings nothing. POST /files takes either a multipart \"file\" (up to 50 MB) or JSON {\"url\": \"https://…\"} and downloads it for you (http/https, up to 10 MB).","analytics":"Read-only, aggregates only. Days and hours are counted in Asia/Atyrau unless you pass timezone=<IANA name>. Kept for 365 days, and unique counters are approximate (HyperLogLog), so per-block uniques do not sum to the total.","socialStatistics":"Read-only, only what Instagram, Threads and TikTok report for the owner's own connected accounts. null means \"no data\", never zero — \"notes\" in every answer says why. Rates are fractions 0..1. The whole /social section answers 404 while the feature is off for this account.","stickers":"Stickers are stuck onto a block, not onto the page: an anchor key, one of nine spots inside it and a shift from that spot in pixels (\"dx\", \"dy\"); \"by\" shifts a sticker from where it stands. The anchors of a page come with GET /profiles/{profile} and GET /profiles/{profile}/stickers. Placing, moving and peeling off all happen in one POST /profiles/{profile}/stickers, applied as a whole: there is no DELETE here. The whole section answers 404 while the feature is off for this account.","preview":"GET /profiles/{profile}/markdown renders the whole page as markdown. Read it back after writing to catch empty blocks and a wrong order before showing the link to the user."},"limits":{"requestsPerSecond":5,"requestsPerMinute":60,"analyticsPerMinute":20,"slotsPerProfile":500,"slotsPerBatch":50,"profilesPerUser":100,"tokensPerUser":5},"examples":{"readProfile":"curl -H 'Authorization: Bearer $TAPTER_TOKEN' 'https://tapter.one/api/v1/profiles/coffeeshop?include=slots'","addButton":"curl -X POST -H 'Authorization: Bearer $TAPTER_TOKEN' -H 'Content-Type: application/json' -H 'Idempotency-Key: add-button-1' -d '{\"type\":\"button\",\"data\":{\"title\":\"Book now\",\"link\":\"https://example.com/book\",\"style\":\"primary\"}}' 'https://tapter.one/api/v1/profiles/coffeeshop/slots'","addManyBlocks":"curl -X POST -H 'Authorization: Bearer $TAPTER_TOKEN' -H 'Content-Type: application/json' -H 'Idempotency-Key: build-coffeeshop-1' -d '{\"slots\":[{\"type\":\"button\",\"data\":{\"title\":\"Book now\",\"link\":\"https://example.com/book\",\"style\":\"primary\",\"media\":\"icon\",\"icon\":\"calendar\"}},{\"type\":\"text\",\"data\":{\"title\":\"About us\",\"description\":\"A coffee shop on Abay street\"}},{\"type\":\"divider\",\"data\":[]}]}' 'https://tapter.one/api/v1/profiles/coffeeshop/slots/batch'","updateManyBlocks":"curl -X PATCH -H 'Authorization: Bearer $TAPTER_TOKEN' -H 'Content-Type: application/json' -d '{\"slots\":[{\"id\":12,\"data\":{\"title\":\"Book a table\"}},{\"id\":15,\"data\":{\"title\":\"About us\"}}]}' 'https://tapter.one/api/v1/profiles/coffeeshop/slots'","deleteManyBlocks":"curl -X DELETE -H 'Authorization: Bearer $TAPTER_TOKEN' -H 'Content-Type: application/json' -d '{\"ids\":[12,15,18]}' 'https://tapter.one/api/v1/profiles/coffeeshop/slots'","reorderSlots":"curl -X PUT -H 'Authorization: Bearer $TAPTER_TOKEN' -H 'Content-Type: application/json' -d '{\"order\":[12,7,33]}' 'https://tapter.one/api/v1/profiles/coffeeshop/slots/order'","addMusic":"curl -H 'Authorization: Bearer $TAPTER_TOKEN' 'https://tapter.one/api/v1/music/lookup?query=USRC11700001' # then POST data.slot as-is to https://tapter.one/api/v1/profiles/coffeeshop/slots","addLeadForm":"curl -H 'Authorization: Bearer $TAPTER_TOKEN' 'https://tapter.one/api/v1/forms' # then POST -d '{\"type\":\"form\",\"data\":{\"formId\":\"019906d1-6f2a-7c1e-9a48-3f1c0b5d24e7\",\"view\":\"button\",\"buttonText\":\"Book a visit\"}}' to https://tapter.one/api/v1/profiles/coffeeshop/slots","createForm":"curl -X POST -H 'Authorization: Bearer $TAPTER_TOKEN' -H 'Content-Type: application/json' -d '{\"title\":\"Book a visit\",\"buttonText\":\"Book\",\"successMessage\":\"Thanks! We will call you back.\",\"fields\":[{\"type\":\"text\",\"label\":\"Name\",\"required\":true},{\"type\":\"phone\",\"label\":\"Phone\",\"required\":true}]}' 'https://tapter.one/api/v1/forms'","readFormFunnel":"curl -H 'Authorization: Bearer $TAPTER_TOKEN' 'https://tapter.one/api/v1/forms/019906d1-6f2a-7c1e-9a48-3f1c0b5d24e7/analytics?period=last28'","whoAmI":"curl -H 'Authorization: Bearer $TAPTER_TOKEN' 'https://tapter.one/api/v1/me'","previewPage":"curl -H 'Authorization: Bearer $TAPTER_TOKEN' 'https://tapter.one/api/v1/profiles/coffeeshop/markdown'","readAnalytics":"curl -H 'Authorization: Bearer $TAPTER_TOKEN' 'https://tapter.one/api/v1/profiles/coffeeshop/analytics?period=last28&include=timeline'","uploadByUrl":"curl -X POST -H 'Authorization: Bearer $TAPTER_TOKEN' -H 'Content-Type: application/json' -d '{\"url\":\"https://example.com/logo.png\"}' 'https://tapter.one/api/v1/files'","changeLanguage":"curl -X PATCH -H 'Authorization: Bearer $TAPTER_TOKEN' -H 'Content-Type: application/json' -d '{\"languageCode\":\"kk\"}' 'https://tapter.one/api/v1/profiles/coffeeshop/settings'"},"notAvailable":["Deleting a profile (link) — dashboard only, it is irreversible.","Profile themes — not open in the dashboard yet, so the API neither returns nor accepts them.","Events and storefront catalogs — event slots are read-only.","Deleting a lead form, its webhook, and reading its submissions — submissions hold visitor personal data and stay in the dashboard. Notification channels are picked per form via notificationChannelIds, but adding and verifying one is dashboard only.","Replacing all slots of a page in one declarative call — delete by id and create explicitly; a sync would also wipe the click stats of the removed blocks."]}}