Questions from developers building with classifaily. All questions are reviewed before publishing.
Always two calls. Each request takes one input and one set of categories. Fire them in parallel to keep total latency low if you need both results before moving on.
When you hit your limit, the API returns a 429 with an error message indicating your quota is exhausted. Requests do not queue up and they do not silently fail. You can upgrade your plan from the dashboard at any point during the month to restore access immediately, or wait for your quota to reset at the start of your next billing cycle.
Yes, any HTTP API call works in a GitHub Actions workflow via a run step with curl or through the actions/github-script action. Store your API key as an Actions secret, then POST to the classify endpoint in a run step with the issue description as the input. It is a straightforward setup and works well for classifying issues, PR titles, or commit messages.
Classifaily processes your input text to return a classification result and does not store your input data after the request completes. We do not use your data to train models. For specifics on data residency, processing agreements, and DPA documentation, reach out to support and we will walk you through what we have in place.
Combine them into a single input string with clear labels, like "Subject: [text]\n\nBody: [text]". The classifier uses the full string as context, so including both fields gives it more signal than either one alone.
Yes, product categorization is one of the most common use cases. Send the product title and description as the input, define your taxonomy as the category list, and get a label back instantly. It works well for tagging new listings on arrival and for cleaning up inconsistencies across an existing catalog.
The most practical path without heavy custom dev is to use Zapier or Make as a bridge. When a new lead comes into Salesforce, the automation sends the relevant fields to classifaily, gets a label back, and writes it to a custom field on the lead record. Salesforce Flow also supports outbound HTTP calls natively, which gives you a more direct option if you are comfortable building in Flow.
Invoices are in your dashboard under Billing. They are generated automatically at the end of each billing cycle and are downloadable as PDFs. If you need a retroactive invoice or a specific format for your finance team, reach out to support and we can help.
The test console in your dashboard does not count against your quota, so that is the best place to experiment with category design and try different inputs before touching the API. Once you move to API calls from your code, those do count toward your plan. Your 100 free requests should be enough to build and test a working integration before you need to upgrade.
A schema is just a saved, reusable category list stored in your account. Instead of sending your full list of categories with every request, you save it once as a schema and reference it by ID. Use schemas when the same category set is being used across multiple integrations or by multiple team members, so you are not duplicating it everywhere and risking it drifting out of sync over time.
No dedicated PHP SDK yet. cURL works well, and so does Guzzle if you prefer a cleaner HTTP client interface. The Help Center has a PHP guide under Platform Guides > PHP with copy-paste snippets for both the classify and batch endpoints.
Check whether you have multiple workers or threads calling the API in parallel. The per-second rate limit is easy to hit when several processes fire requests simultaneously even if the total volume looks low. Adding a short delay between calls or using a queue to serialize outbound requests usually clears it up. The 429 response includes a Retry-After header with the exact wait time if you want to build automatic retry logic.
We accept all major credit and debit cards through Stripe, including Visa, Mastercard, Amex, and Discover. If you are on an enterprise plan and need invoice-based billing or ACH, reach out to support and we can work something out.
Yes, two separate calls. Each request takes one input and one set of categories. You can fire them in parallel to keep total latency low if both results are needed before you continue.
Strip the tags before sending. HTML markup adds noise that can confuse the classifier, especially when there is a lot of structural boilerplate mixed in with the actual content. A quick strip with a library or a simple regex before the API call will noticeably improve accuracy on web-scraped or rich-text input.
The batch endpoint is your biggest lever. Collect items into groups of up to 25 and send each group as a single call instead of one request per item. For the HTTP client itself, httpx with asyncio handles concurrent requests cleanly if you need to parallelize multiple batch calls at once.
20 is on the high end and can hurt accuracy if any of the categories overlap in meaning. Start with the smallest set that covers your actual routing needs, then add categories only when you have a clear action tied to them. Fewer, well-defined categories almost always outperform a long list of similar ones.
Yes, annual billing is available and comes with a discount compared to monthly. You can switch from the billing section of your dashboard. If you want help figuring out which plan fits your expected volume, reach out to support and we are happy to talk it through.
The main ones to handle are 400 (malformed request body or missing required field), 401 (invalid or missing API key), 422 (valid request but input could not be processed, usually an empty or unusable string), 429 (rate limit hit, check the Retry-After header), and 500 (server error, safe to retry with backoff). Covering those five covers the realistic production cases.
Usually it is the categories. Low confidence often means your category definitions are too similar or too broad, so the model cannot cleanly separate them. Try adding a short description to each category in your schema, or split overlapping categories into more distinct ones. Running a sample of low-confidence results through the test console with explain: true will show you exactly where the confusion is coming from.
Airtable automations support both a "Send a webhook" step and a "Run a script" step, and either works with classifaily. The webhook step is simpler: trigger on a new record, send the relevant field to the classify endpoint, then write the returned label back to a field on the same record. If you need conditional logic around the response, the script step gives you full JavaScript control over the whole flow.
Same request, no extra cost. The explain field just adds a reasoning string to the response alongside the label and confidence score. It is worth keeping on during development so you can sanity-check why the model landed on a given label.
The format is up to you. The classifier reads the label as a semantic term, so "billing issue", "billing_issue", and "Billing Issue" will all work. Consistent formatting across requests just keeps your downstream code cleaner. Underscores are the most common convention in our docs, but there is no technical requirement.
There is no time-limited trial, but the free plan is a real way to evaluate the product. You get 100 requests per month with no credit card required, which is plenty to run a meaningful test against your own data. When you are ready to scale up, upgrading is instant from the dashboard.
Yes, that is a clean setup. Postmark fires an inbound webhook for each arriving message, which your server receives as a JSON payload. From there you extract the subject and body, POST them to classifaily, and act on the label you get back. The whole round trip takes well under a second, so your routing logic can run before the user even expects a response.
Yes, multilingual input works well. You do not need to translate before sending. The classifier understands meaning across languages, so French and Spanish inputs will return accurate labels against your standard category list.
Start in the dashboard test console. You can paste any text, define your categories, and see the label and confidence score right away without writing a line of code. Once your category design feels solid there, move to curl or your preferred language against the live API. Your free plan's 100 requests are more than enough to build and validate a working integration before you need to upgrade.
Yes, there is a character limit on the input field. For most use cases, classifying the first 500 to 1000 characters gives you the same accuracy as sending the full text, since intent typically comes through in the opening. If you are regularly working with long documents, try truncating the input before sending and check whether your results hold.
Unused requests do not roll over. Your quota resets at the start of each billing cycle regardless of how much you used. If you find you regularly have a lot left over, it might be worth staying on a lower plan for now.
No native module yet, but Make connects to classifaily cleanly through the HTTP module. Set the method to POST, point it at https://api.classifaily.com/v1/classify, add your Authorization header with your Bearer token, and set the body fields for input and categories. We have a full step-by-step guide in the Help Center under Platform Guides > Make if you want screenshots and the full walkthrough.
Use /v1/classify when you are processing items one at a time in real time, like classifying a support ticket the moment it arrives. Use /v1/batch when you have a group of items ready at once, like processing a queue of backlogged records or a CSV export. Batch is more efficient in those cases since you are reducing round-trip overhead, and it counts as one request per item for billing just like the single endpoint.
There is both. Your plan sets the monthly request quota, and a per-second rate limit applies on top of that to keep things stable for all users. If you hit the per-second limit, you will get a 429 response with a Retry-After header telling you exactly how long to wait before retrying.
Use single-label when you need one definitive routing decision - support ticket triage, lead scoring, spam detection. The model picks the best fit even if the content is ambiguous, which is exactly what you want when the output drives a branch in a workflow.
Use multi-label (set mode: "multi" in your request) when the content genuinely belongs to multiple categories and you want to capture all of them - tagging articles, enriching product records, extracting multiple topics from a document. Multi-label returns all categories above a confidence threshold rather than forcing a single winner.
A practical rule: if acting on the result means picking a lane (route to queue A OR B), use single. If the result enriches a record that can hold multiple values (tag with A AND B), use multi.
Quotas are account-wide, not per key. You can check your quote at any time in the account dashboard!
Yes, absolutely - and we recommend it for more context. The input field is just a string - you can structure it however you want. A common pattern is to prepend metadata as labeled fields before the main content:
Sender domain: acme.com
Subject: Renewal question
Body: Hi, I wanted to ask about...
The classifier treats the whole string as context, so relevant signals like sender domain, subject line, or any other metadata you include will factor into the result. Just keep the format consistent across your requests so the model sees a predictable structure.
Yo! Standard Bearer token auth - nothing special required. In your n8n HTTP Request node: set Authentication to "Header Auth", Name to Authorization, Value to Bearer YOUR_KEY_HERE (with the space). Body should be JSON with your input and categories fields.
The confidence score is a value between 0.0 and 1.0 that reflects how clearly the input maps to the winning label relative to your other categories. Think of it as a signal strength rather than a strict statistical probability.
Our recommendation: Greater than .75 is a strong confidence score. Anything between .74 and .5 we typically mark for review. Less than .5 is a low confidence score, and suggests that a different classification set might be helpful.
Yes, but it appears that you are using a free-tier account, so your batch size will be limited to 1 per request. You can increase the number of inputs by upgrading to a paid plan.
Batch counts as one API call per input for billing purposes, so a batch of 10 = 10 requests against your monthly quota. It's faster than making 10 separate calls though, since you save the round-trip overhead on each one.
There's no native Zapier app yet - you connect via Webhooks by Zapier (POST action) or a Code step. Webhooks by Zapier is the easier route: set the URL to https://api.classifaily.com/v1/classify, add an Authorization header with your Bearer token, and set the body fields (input, categories or schema_id).
We have a full step-by-step guide in the Help Center under Platform Guides → Zapier that covers both approaches with screenshots. The webhook method requires no coding and takes about 10 minutes to set up.